最近版本的 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
是desugared to 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
但这样的话,你大概只会得到一个运行时的错误。