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