Skip to content

Bang patterns bind... unexpectedly. Deserves loud warning

Consider the following,

{-# LANGUAGE BangPatterns #-}
hello :: [Int] -> ()
hello (!x:xs) = ...

To me it seems like the bang pattern should be applied to x; but it's not! In fact, this program is equivalent to,

hello (!(x:xs)) = ...

This strikes me as quite surprising, yet there is no mention of how ! is supposed to bind in the users guide nor the Haskell Prime proposal.

This behavior is slightly less surprising if you consider that the bang pattern !Just x is equivalent to !(Just x) (although this also strikes me as a bit unfortunate, although it is likely too late to do much about this).

In sum: We need to document the current syntactic binding properties of ! in the users guide.

Trac metadata
Trac field Value
Version 7.10.3
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Documentation
Test case
Differential revisions
BlockedBy
Related
Blocking
CC
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information