haskell - 是否有无符号整数类型会警告负文字?

标签 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 这样的文字脱糖为 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/

相关文章:

haskell - Haskell rec 关键字是如何工作的?

haskell - 如何为状态类型不透明的有状态组件创建接口(interface)?

windows - 具有 NoBuffering 的 Haskell 跨平台 getChar

haskell - Forall'd 约束在 RULE 中不受 lhs 约束

GHCi 中的 Haskell 函数

haskell - 带有可遍历的任意单子(monad)的组合总是单子(monad)吗?

haskell - 如何强制 GHC 内联 FFI 调用?

haskell - 为什么 GHC 在脱糖之前要进行类型检查?

haskell - Haskell 中的有界计算

haskell - 如何在 Rust 中复制 Haskell 的 `scanl (+) 0 xs`?