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
这样的文字脱糖为 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
,但是你可能只会得到一个运行时错误。
关于haskell - 是否有无符号整数类型会警告负文字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26574302/