6.2.2. The magic hash — Glasgow Haskell Compiler 9.0.0.20201227 User's Guide

# 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#`