Suggestion for bang patterns documentation

Christian Maeder Christian.Maeder at dfki.de
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:
> http://www.haskell.org/ghc/docs/latest/html/users_guide/bang-patterns.html

<cite>
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)
</cite>

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
constructors.
    Instead, use a case-expression, or do-notation, to unpack the
constructor.
    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