
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