为何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
相关产品推荐
相关产品推荐

