You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Sum Double没有Fractional实例?

关于Sum Double缺少Fractional实例的疑问与解答

问题重现

在GHCi中执行以下代码时出现错误:

Data.Semigroup> 0.1 :: Sum Double
<interactive>:2:1: error: [GHC-39999]
    • No instance for ‘Fractional (Sum Double)’
        arising from the literal ‘0.1’
    • In the expression: 0.1 :: Sum Double
      In an equation for ‘it’: it = 0.1 :: Sum Double

疑问:这个缺失是疏忽所致,还是有原则性的理由?毕竟Double加法不满足结合律的问题已经被接受,instance Monoid (Sum Double)实例也早已存在。


解答:这是有设计考量的,并非疏忽

  • 核心定位匹配问题:Sum的设计目标是封装加法半群/幺半群的行为,只需要支持加法运算和零元即可。而Fractional类型类包含除法、倒数、有理数转换等与加法幺半群无关的操作,给Sum Double添加这个实例会超出它的核心职责范围。

  • 语义清晰性要求:Sum作为一个新类型,其构造方式应该显式化——你应该用Sum 0.1来创建值,而不是依赖Fractional的fromRational自动转换浮点字面量。这样能明确表达“这是一个用于累加的封装值”的语义,避免模糊类型的用途。

  • 实例扩展的克制性:虽然Double加法不满足严格的结合律,但Monoid (Sum Double)的存在是因为累加器的需求极为普遍,且实际场景中浮点误差的影响通常可接受。但这不代表要给Sum Double添加所有可能的数值类型类实例,Fractional属于非必要的扩展,因此没有被纳入标准库。


内容的提问来源于stack exchange,提问作者Daniel Wagner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 15:07:07