当数字常数超出范围时,为什么GHC不抱怨

 beauty360尜囡囡 发布于 2023-02-09 18:17

GHC默默地忽略数值常量中的超出范围位.

这种行为导致我今天与一个相当奇怪的bug搏斗:

[0..256]::[Word8] -- evaluates to [0]!

我知道是什么导致了这个错误(在rot256世界中256 == 0)....我感兴趣的是为什么GHC/Haskell的设计不会在编译时抱怨它.

(这种行为对于Int也是如此 - 例如,18446744073709551617::Int = 1).

我已经习惯了Haskell捕捉琐碎的编译时间问题,当我不得不追踪它时,我感到很惊讶.

1 个回答
  • 我怀疑诚实的答案是"因为没有人实现它".但我认为这个答案还有另一层,那就是有一些微妙的设计问题.

    例如:我们应该怎么知道256超出范围Word8?好吧,我想一个答案可能是,编译器可以发现Word8是一个实例所有三个Integral,OrdBounded.所以它可以生成一个支票

    (256 :: Integer) > fromIntegral (maxBound :: Word8)
    

    并在编译时评估此检查.问题是,突然之间,我们正在运行的潜在用户编写的代码(例如maxBound,fromIntegral(>)大概都来自可以由程序员编写实例声明)在编译时.这可能有点危险 - 因为我们无法判断我们是否会得到答案!因此,至少你会希望默认情况下关闭此检查,并且可能至少与模板Haskell一样难以打开.

    在另一方面,它也可能是可能只是建立我们的"信任"情况下的少数-如Word8Int,就像你说的.我会发现有点令人失望,但也许这样的补丁不会被拒绝.

    2023-02-09 18:20 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有