
Dan Licata wrote:
On Jul25, apfelmus wrote:
The point is to be able to define both zip and pairs with one and the same operator :< .
There's actually a quite simple way of doing this. You make the view type polymorphic, but not in the way you did:
type Queue elt empty :: Queue elt cons :: elt -> Queue elt -> Queue elt
data ViewL elt rec = EmptyL | elt :< rec
view :: Queue elt -> ViewL elt (Queue elt) view2 :: Queue elt -> ViewL elt (ViewL elt (Queue elt))
This is cool! The more so because 'view2' can quite easily be defined in terms of 'view' view2 q = case view q of EmptyL -> EmptyL x :< q' -> x :< view q' so it suffices to provide the one-level 'view' as a library function. Does this scale to views containing multiple nestable constructors? It would, of course, be nice to get rid of having to write view2 altogether... Cheers Ben