6.9.5. Sized primitive literal syntax

ExtendedLiterals
Since:9.8.1

Allows defining unboxed numeric primitive values through #Type suffixes on numeric literals e.g. 0xFF#Word8 :: Word8#.

The MagicHash extension enables some new literals, including 3# :: Int#, 3## :: Word#. This does not extend to all unboxed values. For example, there is no literal syntax for Word8#: you must write something such as wordToWord8 (3## :: Word#) :: Word8#.

ExtendedLiterals enables further syntax for defining primitive numeric literals. Suffix any Haskell integer lexeme with a hash sign # followed by a primitive numeric type (without its hash suffix) to obtain a value of that type. For example, 0xFF#Word8 :: Word8#. There must be no spaces between the parts of the literal.

The primitive numeric types allowed are:

  • Int8#
  • Int16#
  • Int32#
  • Int64#
  • Int#
  • Word8#
  • Word16#
  • Word32#
  • Word64#
  • Word#

All types permit any nonnegative Haskell integer lexeme, e.g. 70, 0x2A, 0o1276, 0b1010 (with BinaryLiterals). The signed Int types also permit negative integer lexemes. Defining a literal with a value that can’t fit in its requested type will emit an overflow warning by default, the same as boxed numeric literals.

As with MagicHash, this extension does not bring anything into scope, nor change any semantics. The syntax only applies to numeric literals. You may want to import GHC.Exts (see Unboxed types and primitive operations) to refer to the types of the literals you define.