# Pattern guards

David Roundy droundy at darcs.net
Sat Sep 30 23:04:12 EDT 2006

```On Sun, Oct 01, 2006 at 02:08:35AM +0200, Yitzchak Gale wrote:
> David Roundy wrote:
> >>foo (Left "bar") = "a"
> >>foo (Right x) | (b,"foo") <- break (==' ') x = "b " ++ b
> >>              | ["Hello",n,"how","are","you",d@(_:_)] <- words x,
> >>                last d == '?'
> >>        = n ++ " is not here right now, but " ++ n ++ " is " ++
> >>          init d ++ " fine."
> >>foo (Left x) | ("foo",c) <- break (==' ') x = "c " ++ c
> >>             | length x == 13 = "Unlucky!"
> >>foo (Right x) = x
> >>foo (Left x) = x
>
> And here it is in Haskell 98:
>
> >foo (Left "bar") = "a"
> >foo (Right x) | isExit y = runExit y
> > where y = do
> >  maybeExit \$ do (b,"foo") <- return \$ break (==' ') x
> >                 return \$ "b" ++ b
> >  maybeExit \$ do ["Hello",n,"how","are","you",d@(_:_)] <- return \$ words x
> >                 guard \$ last d == '?'
> >                 return \$ n ++ " is not here right now, but " ++
> >                          n ++ " is " ++ init d ++ " fine."
> >foo (Left x) | isExit y = runExit y
> > where y = do
> >  maybeExit \$ do ("foo",c) <- break (==' ') x
> >                 return \$ "c" ++ c
> >  when (length x == 13) \$ Exit "Unlucky!"
> >foo (Right x) = x
> >foo (Left x) = x

I disagree as far as the beauty of this approach.  You require that
every pattern guard involves a where binding, plus the use of a three
function calls (isExit, runExit and maybeExit, plus sometimes one or
more calls to guard).  In my opinion that makes it less concise than
the usual pattern matching approach.

One extra where binding may not much matter in simple functions like
this, but in complicated functions that are already hard to read and
understand (because they do complicated things, not because they're
poorly written), throwing in extra where bindings is just a waste.

Also, in your code you're forced to mingle the "pattern matching" with
the actual code itself, which to me makes the result less legible.
And would be even worse if the function were one that returns a