GHC默默地忽略数值常量中的超出范围位.
这种行为导致我今天与一个相当奇怪的bug搏斗:
[0..256]::[Word8] -- evaluates to [0]!
我知道是什么导致了这个错误(在rot256世界中256 == 0)....我感兴趣的是为什么GHC/Haskell的设计不会在编译时抱怨它.
(这种行为对于Int也是如此 - 例如,18446744073709551617::Int = 1
).
我已经习惯了Haskell捕捉琐碎的编译时间问题,当我不得不追踪它时,我感到很惊讶.
我怀疑诚实的答案是"因为没有人实现它".但我认为这个答案还有另一层,那就是有一些微妙的设计问题.
例如:我们应该怎么知道256
超出范围Word8
?好吧,我想一个答案可能是,编译器可以发现Word8
是一个实例所有三个的Integral
,Ord
和Bounded
.所以它可以生成一个支票
(256 :: Integer) > fromIntegral (maxBound :: Word8)
并在编译时评估此检查.问题是,突然之间,我们正在运行的潜在用户编写的代码(例如maxBound
,fromIntegral
和(>)
大概都来自可以由程序员编写实例声明)在编译时.这可能有点危险 - 因为我们无法判断我们是否会得到答案!因此,至少你会希望默认情况下关闭此检查,并且可能至少与模板Haskell一样难以打开.
在另一方面,它也可能是可能只是建立我们的"信任"情况下的少数-如Word8
和Int
,就像你说的.我会发现有点令人失望,但也许这样的补丁不会被拒绝.