6.2.2. The magic hash

MagicHash
Since:6.8.1

Enables the use of the hash character (#) as an identifier suffix.

The language extension MagicHash allows # as a postfix modifier to identifiers. Thus, x# is a valid variable, and T# is a valid type constructor or data constructor.

The hash sign does not change semantics at all. We tend to use variable names ending in “#” for unboxed values or types (e.g. Int#), but there is no requirement to do so; they are just plain ordinary variables. Nor does the MagicHash extension bring anything into scope. For example, to bring Int# into scope you must import GHC.Prim (see Unboxed types and primitive operations); the MagicHash extension then allows you to refer to the Int# that is now in scope. Note that with this option, the meaning of x#y = 0 is changed: it defines a function x# taking a single argument y; to define the operator #, put a space: x # y = 0.

The MagicHash also enables some new forms of literals (see Unboxed types):

  • 'x'# has type Char#
  • "foo"# has type Addr#
  • 3# has type Int#. In general, any Haskell integer lexeme followed by a # is an Int# literal, e.g. -0x3A# as well as 32#.
  • 3## has type Word#. In general, any non-negative Haskell integer lexeme followed by ## is a Word#.
  • 3.2# has type Float#.
  • 3.2## has type Double#