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.Exts
(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 typeChar#
"foo"#
has typeAddr#
3#
has typeInt#
. In general, any Haskell integer lexeme followed by a#
is anInt#
literal, e.g.-0x3A#
as well as32#
.3##
has typeWord#
. In general, any non-negative Haskell integer lexeme followed by##
is aWord#
.3.2#
has typeFloat#
.3.2##
has typeDouble#