Pattern guards
Conor McBride
ctm at Cs.Nott.AC.UK
Sat Sep 30 09:51:55 EDT 2006
Claus Reinke wrote:
> If it wasn't for those pesky returns/guards, one might claim the
> translations
> to be as concise as the originals. As it stands, the results of the
> translation
> are rather more awkward but -and this is the important point- pattern
> guards do not add new functionality.
Well, neither do Boolean guards nor even basic pattern matching (with
respect to case expressions). I'm not necessarily in favour of pattern
guards exactly as formulated, but I am in favour of thinking about
syntax to support a more readable presentation of the scrutiny process
by which functions make choices. Things to minimise include
(1) Wiring: naming a thing in order to inspect it, as in
mygcd x y
| LT <- z = mygcd x (y-x)
| GT <- z = mygcd (x-y) y
where z = compare x y
mygcd x _ = x
The version I proposed
gcd x y | compare x y ->
LT = gcd x (y - x)
GT = gcd (x - y) y
gcd x _ = x
avoided the need for this indirection via z and the dislocation of
(compare x y) from the patterns which give it relevance. I want to
present a direct tabulation of patterns visibly headed by the expression
they analyse. It's far more comprehensible.
(2) Monadic noise: one simply should not need to clutter a program with
do, return, mplus and fromJust (ugh!), spelling out the semantics of
pattern matching in minute detail. For at least 36 years, we've been
able to hide all that junk behind a highly readable equational notation.
This is one monad we don't need to see.
(3) Early commitment to one particular right-hand side: without pattern
guards, we're forced to the right if we want to examine the result of an
intermediate computation. This means we have to do any subsequent
analysis using the syntax of expressions which is much clunkier than
that of left-hand sides. Pattern guards as proposed give us a bare
minimum, a one-shot match: more patterns require wiring. The notation I
suggested is a modest improvement, allowing multiple attempts to match,
but it's still not as general as it might be. If, for example, we wanted
to analyse one of the original pattern variables further, in the light
of a case on an intermediate value, we're stuffed.
In general, I'd like to be able to compact programs written with helper
functions, eg
gcd x y = help x y (compare x y) where
help 0 y LT = y
help x y LT = gcd x (y - x)
help x 0 GT = x
help x y GT = gcd (x - y) y
help x _ _ = x
Introducing the helper just adds an 'extra column' for (compare x y),
and then we can do what we like! I'd quite like to inline this a little.
Apologies for the wildly made-up notation
gcd x y | compare x y -> -- just introduces new column
gcd 0 y , LT = y
gcd x y , LT = gcd x (y - x)
gcd x 0 , GT = x
gcd x y , GT = gcd (x - y) y
gcd x _ , _ = x
I'd adopt the convention that omitting the
lhs,
just means the gets copied from left of the |, so we recover my earlier
notation as a special case, and we don't get punished for /not/
inspecting pattern variables further.
Yes, I know the example is contrived, but as David points out, it's hard
to come up with simple examples of phenomena which tend to bite in more
complex situations.
I'm guessing this is all too wild and woolly for haskell-prime, but I
thought I'd try to survey a bit more of the design space in the
interests of an effective compromise. All of these programs can be
turned into decision trees made from let and case-on-variable: the
question is to what extent we support the compression of these trees as
contingency tables for the sake of clarity. Do we give up at the first
let? At the first non-Boolean let? At the first let x not immediately
followed by some favoured pattern of case x? When?
The recodings of the pattern guard programs we've seen so far strike me
as eloquent arguments in favour of adopting at least the notion of
pattern guards from the original proposal.
All the best
Conor
This message has been checked for viruses but the contents of an attachment
may still contain software viruses, which could damage your computer system:
you are advised to perform your own checks. Email communications with the
University of Nottingham may be monitored as permitted by UK legislation.
More information about the Haskell-prime
mailing list