Подтвердить что ты не робот

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

Последние версии 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

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

4b9b3361

Ответ 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, но тогда вы предположительно получите только ошибку времени выполнения.