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 Pattern guards zip xs ys | EmptyL <- viewl xs = empty | EmptyL <- viewl ys = empty | x :< xt <- viewl xs, y :< yt <- viewl ys = (x,y) <| zip xt yt Pattern guards variant zip xs ys | EmptyL <- xs' = empty | EmptyL <- ys' = empty | x :< xt <- xs', y :< yt <- ys' = (x,y) <| zip xt yt where xs' = viewl xs; ys' = viewl ys View patterns zip (viewl -> EmptyL) _ = empty zip _ (viewl -> EmptyL) = empty zip (viewl -> x :< xs) (viewl -> y :< ys) = (x,y) <| zip xs ys My dream zip EmptyL _ = empty zip _ EmptyL = empty zip (x:<xs) (y:<ys) = (x,y) <| zip xs ys Regards, apfelmus