有没有一种无符号整数类型会警告负数?

问题描述 投票:25回答:1

最近版本的 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

是否有任何类型可以警告负数的存在 或者有什么方法可以让我创建自己的自定义类型来警告?

haskell ghc
1个回答
37
投票

默认情况下,像 -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但这样的话,你大概只会得到一个运行时的错误。

© www.soinside.com 2019 - 2024. All rights reserved.