Tom Pledger wrote: > Something along these lines: > > class List l a | l -> a where > nil :: l > cons :: a -> l -> l > > But that's not of much use, because there isn't a class method to > recover the elements of a List. We could add more methods (corresponding > to null, head, and tail)
Actually we merely need to add a deconstructor. Also, we can leave the type of elements fully polymorphic. Something like this: > class List l where > nil :: l a > cons :: a -> l a -> l a > decon :: l a > -> w -- on empty > -> (a -> l a -> w) > -> w > > instance List [] where > nil = [] > cons = (:) > decon [] on_nil on_cons = on_nil > decon (h:t) on_nil on_cons = on_cons h t we can then write truly generic list-processing functions: > rev:: List l => l a -> l a > rev l = rev' l nil > where > rev' l acc = decon l acc (\h t -> rev' t (cons h acc)) not in a terribly convenient way though. *Foo> rev "abc" "cba" _______________________________________________ Haskell-Cafe mailing list [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/haskell-cafe
