Suggestion for bang patterns documentation

Christian Maeder Christian.Maeder at
Fri Feb 27 06:15:40 EST 2009

Brian Bloniarz wrote:
> I got confused by the GHC documentation recently, I was wondering how
> it could be improved. From:

The let-binding can be recursive. However, it is much more common for
the let-binding to be non-recursive, in which case the following law
holds: (let !p = rhs in body)  is equivalent to (case rhs of !p -> body)

Shouldn't the bang be removed in the final case pattern?

Furthermore with existential types the let binding is not supported:

 data E = forall a . Show a => E a

 f :: E -> String
 f x = case x of E a -> show a

f works, but g

 g :: E -> String
 g x = let !(E a) = x in show a

fails (with or without the bang):

    My brain just exploded.
    I can't handle pattern bindings for existentially-quantified
    Instead, use a case-expression, or do-notation, to unpack the
    In the binding group for
        !(E a)
    In a pattern binding: !(E a) = x
    In the expression: let !(E a) = x in show a
    In the definition of `g': g x = let !(E a) = x in show a

Cheers Christian

P.S. It should be mentioned that ~ and ! only make sense for single
variant data types (like tuples)

More information about the Glasgow-haskell-users mailing list