
apfelmus wrote:
Jules Bean wrote:
Have you tried using pattern guards for views?
f s | y :< ys <- viewl s = .... | EmptyL <- viewl s = ....
Hm, I'd simply use a plain old case-expression here
f s = case viewl s of y :< ys -> ... EmptyL -> ...
In other words, case-expressions are as powerful as any view pattern may be in the single-parameter + no-nesting case.
A better example is probably zip for sequences (Data.Sequence.Seq):
zip :: Seq a -> Seq b -> Seq (a,b) zip xs ys = case viewl xs of x :< xt -> case viewl ys of y :< yt -> (x,y) <| zip xt yt EmptyL -> empty EmptyL -> empty
This is how I do it, no pattern guards, no view patterns: zip :: Seq a -> Seq b -> Seq (a,b) zip xs ys = case (viewl xs,viewl ys) of (EmptyL, _ ) -> empty (_, EmptyL ) -> empty (x :< xt, y :< yt) -> (x,y) <| zip xt yt This is IMHO a lot clearer than any of the alternatives you listed, except your 'dream' (which is exactly what 'real' views would give us). Cheers Ben, member of the we-want-real-views-or-nothing-at-all movement ;-)