I actually meant
data Container a = Many a(Container a)
but here is what I don't understand (fyi, I am a beginner) how can you
construct this container? I can do
let a = Many "somestring" - and I will get back a function but I can not do
let a = Many 'a' "somestring" - because the second param is not
(Container a) type.
let a = Many 'a' (Container ['a','a']) - doesn't work either because
Container is a type not a constructor (right or I am missing
something?).
So I have two questions:
1. When I do
let b = Many "somestring" , I get
:t b
b :: Container[Char] -> Container[Char]
what is it and why I am allowed to pass just one parameter to Many
(and how can I use it)?
2. How can you construct that container?
data Container a = Many a(Container a)
let a = ????
On Fri, Jun 5, 2009 at 4:01 PM, Tillmann Rendel<rendel at cs.au.dk> wrote:
> Hi,
>> please write to the whole list, not just me. There are a lot of people
> around who can help you.
>> MH wrote:
>>>> Rendel do you mind to explain to me how Container a = Many a
>> (Container [a]) prevents user from creating an empty list?
>> I did try the following:
>> let a = Many "string"
>> a :: Container [Char] -> Container [Char]
>> let b = Many []
>> b :: forall a. Container [a] -> Container [a]
>>>> but I can not understand what is the difference.
>> You cannot prevent users from creating an empty list, because lists are
> already defined in the Haskell prelude, and you cannot change that
> definition. But you can define your own datatype Container which prevents
> users from creating empty containers.
>> Your datatype
>> data Container a = Many a (Container [a])
>> is quite complicated, because you have (Container a) on the left hand side
> of the equation, but (Container [a]) on the right hand side. Is that on
> purpose?
>> Anyway, your Container has the property that a (Container a) is never empty,
> because it always contains at least one value of type a, namely the first
> parameter of Many. To see that, we can write a function which extracts that
> element:
>> getContainerElement :: Container a -> a
> getContainerElement (Many element something) = element
>> It is not possible to write such a function for ordinary lists without
> calling error or entering a nonterminating loop:
>> getListElement :: [a] -> a
> getListElement (element : something) = element
> getListElement [] = error "no element around :("
>> So ordinary lists can be empty, but your Containers can't.
>> Tillmann
>