[Haskell] Replacing and improving pattern guards with PMC syntax

kahl at cas.mcmaster.ca kahl at cas.mcmaster.ca
Mon Oct 2 15:33:37 EDT 2006


Brandon,

 > Both of these constructs amount to minor syntactical overloading, 
 > allowing lambda and "case" constructs in the expression grammar and the 
 > match grammar with slightly different meanings. This seems to be pretty 
 > similar to the way we already allow (Constr x y z) as an expression or a 
 > pattern.

I'm afraid this could easily lead to ambiguity on the grammar level
and, independently, to confusion in the human head.
But if these issues can be resolved,
I currently do not feel strongly either way.

Note however that

> f xs = case xs of
>     (x : xs) -> case xs of
>                     (y : ys) -> 1
>     _        -> 2

and

> g xs = case xs of
>     (x : xs) -> match xs with
>                     (y : ys) -> 1
>     _        -> 2

are different:

f "01" = 1             g "01" = 1
f "0"  = undefined     g "0"  = 2
f ""   = 2             g ""   = 2

f is in Haskell 98, and g can be rewritten using pattern guards:

> g xs = case xs of
>     (x : xs) | (y : ys) <- xs   -> 1
>     _        -> 2

That is what I mean with ``fall-through'' --- and from this you see that
you need an indicator for whether what is coming after the ``->''
is a matching or an expression.

As long as the production

  alt -> expr

is included, nothing that parses as an expression
can be allowed to also parse as a matching according to a different production.

In PMC, the corresponding production is

  match -> \leftharpoonup expr \rightharpoonup

, so there, using ``case'' both for expressions and for matchings
would ``only'' be confusing...

But using delimiters is of course an option.
(I also considered a different arrow for one of the two cases,
 for example ``|=>'' as in PMC, or even ``=>'',
 but I thought that the delimiter-less option was more ``Haskell-ish'',
 and with care in the grammar design can be made to work.)


Several of your suggestions, including

 > I suggested whitespace rather than -> to separate sequential patterns

could be feasible alternatives for the concrete syntax ---
but we first need agreement on the abstract syntax.



Perhaps the extension

  alt -> "match" exp "with" { alts }

could be considered as an independent extension;
this is more powerful than pattern guards,
and probably less controversial than multi-alternative lambda.


Wolfram


More information about the Haskell-prime mailing list