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
是否有任何类型会对负面文字发出警告,或者我是否可以创建自己的自定义类型进行警告?
答案 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
的类型,但之后您可能只会遇到运行时错误。