
Hi Tillmann, thank you for the elaborate example. This is exactly what it took for me to realize that you and Jake have indeed given me the solution that I need. I had a very hard time getting my head around it, but to my defense I'm usually working on this stuff in the wee hours. :) Günther Tillmann Rendel schrieb:
Hi Günther,
Günther Schmidt wrote:
data Container a = Single a | Many a [a] but the problem above
I need a data structure as in my example without the [] being possible to be empty.
So lets write a variant of list which cannot be empty. A usual list is empty, or a head and a tail:
data List a = Empty | HeadAndTail a (List a)
Now, our kind of list should be just one element, or a head and a tail:
data NonEmptyList a = JustOne a | HeadAndNonEmptyTail a (NonEmptyList a)
So we can replace [] by NonEmptyList in your definition to get what you want:
data Container a = Single a | Many a (NonEmptyList a)
However, since Container and NonEmptyList are isomorphic, we can use one instead of the other:
data Container a = Single a | Many a (Container a)
Whether this is a good idea depends on the purpose of the types, but I guess it is.
Tillmann