Bang patterns

Ian Lynagh ian at
Fri Feb 1 18:10:42 CET 2013

Hi all,

I would like to get a full specification of the bang patterns syntax,
partly so it can be proposed for H', and partly so we can resolve
tickets like correctly.

I think there are 3 possibilities:

The first is suggested by "A bang only really has an effect if it
precedes a variable or wild-card pattern" on

We could therefore alter the lexical syntax to make strict things into
lexems, for example
    reservedid -> ...
                | _
                | !_
    strictvarid -> ! varid
etc. This would mean that "f !x" is 2 lexemes, and "f ! x" 3 lexemes,
with the former defining the function 'f' and the latter defining the
operator '!'.

This has 3 downsides:

* It would require also accepting the more radical proposal of making
  let strict, as it would no longer be possible to write
    let ![x,y] = undefined in ()

* It would mean that "f !x" and "f !(x)" are different. Probably not a
  big issue in practice.

* It may interact badly with other future extensions. For example,
    {-# LANGUAGE ViewPatterns #-}
    f !(view -> x) = ()
  should arguably be strict in x.
  (you might also argue that it should define the operator '!'.
  Currently, in ghc, it defines an 'f' that is lazy in x, which IMO is a

The second is to parse '!' differently depending on whether or not it is
followed by a space. In the absence of a decision to require infix
operators to be surrounded by spaces, I think this is a bad idea: Tricky
to specify, and to understand.

The third is to parse '!' in patterns in the same way that '~' is parsed
in patterns, except that (!) would be accepted as binding the operator
'!'. This means that "f ! x" defines f.

So my proposal would be to go with option 3. What do you think? And did
I miss any better options?


More information about the Haskell-prime mailing list