
Thanks David, that's really clever! I was trying to do it without any
auxiliary data types, but couldn't see how I could use an instance of
(BiList a b) in the constructor expression for (BiList a b) without
losing the property that the list elements alternate from one type to
the other with each new element.
But now I see that when you write (BiList b a) in the constructor
expression, that's written in the context provided by the (data BiList
a b) line, so having the type variables in the opposite order makes
all the difference.
Brent, David's definition actually solved both (1) and (2), try it out!
On 4/3/14, Denis Kasak
On 3 April 2014 22:58, Brent Yorgey
wrote: data BiList a b = BA (AltList a b) | BB (AltList b a)
data AltList a b = Empty | Cons a (AltList b a)
So this addresses (2) but not (1). I don't think there is any way around the need for (1). (Note, however, that you do still have two distinct representations of the empty list: BA Empty and BB Empty. I can't see any way around that either.)
You could move the Empty constructor to BiList while making AltList a non-empty list, i.e.
data BiList a b = Empty | BA (AltList a b) | BB (AltList b a)
data AltList a b = Elem a | Cons a (AltList b a)
-- Denis Kasak _______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners