Существует ли целое число без знака, которое будет предупреждать об отрицательных литералах?

Последние версии ghc будут предупреждать вас, если целочисленный литерал находится за пределами заданного диапазона типов. Например:

$ ghci
>>> let x = 330492039485 :: Data.Word.Word8
<interactive>:2:9: Warning:
    Literal 330492039485 is out of the GHC.Word.Word8 range 0..255

Однако ghc не будет предупреждать об отрицательных числовых литералах для типов Data.Word. Вместо этого он подпадает (преднамеренно, согласно документации):

>>> let x = -1 :: Data.Word.Word8
>>> x
255

Существуют ли какие-либо типы, которые будут предупреждать об отрицательных литералах, или есть способ создать свой собственный настраиваемый тип, который предупреждает?

Ответ 1

По умолчанию литерал типа -1 выводится на negate (fromInteger 1). Однако существует языковое расширение NegativeLiterals, которое вызывает его desugar как fromInteger (-1). Если вы включите это, вы получите предупреждение:

Prelude> :m +Data.Word
Prelude Data.Word> :set -W
Prelude Data.Word> :set -XNegativeLiterals
Prelude Data.Word> -1 :: Word

<interactive>:74:1: Warning:
    Literal -1 is out of the Word range 0..18446744073709551615
18446744073709551615
Prelude Data.Word>

В качестве альтернативы вы можете сделать свой собственный тип, который переопределил negate, но тогда вы предположительно получите только ошибку времени выполнения.