.. _extended-literals:

Sized primitive literal syntax
------------------------------

.. extension:: ExtendedLiterals
    :shortdesc: Enable numeric literal postfix syntax for unboxed integers.

    :since: 9.8.1

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

The :extension:`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#``.

:extension:`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 :extension:`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 :extension:`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 :ref:`primitives`) to refer to the
types of the literals you define.