Существует ли целое число без знака, которое будет предупреждать об отрицательных литералах?
Последние версии 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
, но тогда вы предположительно получите только ошибку времени выполнения.