
On Fri, Jun 5, 2009 at 4:13 PM, Jason Dagit
On Fri, Jun 5, 2009 at 2:58 PM, MH
wrote: 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
I think I saw the above definition described as a coalgebra or codata: http://blog.sigfpe.com/2007/07/data-and-codata.html
Basically, that list has to always be infinite.
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 = ????
Check that link above for answers to some of your questions.
I think that basically you want a different type: data NonEmptyList a = JustOne a | MoreThanOne a (NonEmptyList a)
I am still not sure why so much attention is being given to the recursive version. I find the most elegant and useful to be this simple one: data NonEmpty a = NonEmpty a [a] With the obligatory conversions: toList (NonEmpty x xs) = x:xs fromList [] = Nothing fromList (x:xs) = Just (NonEmpty x xs) Luke