是否有一个无符号整数类型会警告负面文字?

时间:2014-10-26 14:54:35

标签: haskell ghc

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 个答案:

答案 0 :(得分:37)

默认情况下,-1这样的文字会被negate (fromInteger 1)所取代。但是,有一种语言扩展名NegativeLiterals会导致它变为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的类型,但之后您可能只会遇到运行时错误。