为什么Haskell中没有Nums Ords?

Odi*_*din 18 haskell typeclass

我知道对于具有类型Num类实例的类型,必须有一个来自EqShow

class (Eq a, Show a) => Num a
Run Code Online (Sandbox Code Playgroud)

我想知道为什么要这样做Eq而不是Ord.数值类型是否有意义Eq但不存在Ord

dav*_*420 35

例如,可以添加,减去,乘以复数,并测试相等性,但不进行排序.Complex a从基数的Data.Complex 看.

  • 可以对复数进行排序(例如,词典排序是部分和全部的).请注意,这不是一个特别有用的顺序(并且它们不允许和排序使它们成为有序字段). (3认同)

scl*_*clv 22

请注意,这些EqShow约束也被广泛认为是错误的.例如,它们会阻止Num包含函数的事物的完全有效实例.在最新版本的GHC中,这些约束也被删除,Num完全没有超类约束.

  • @PhilipJF:所有`x`都是`2x≡2`?我不会对此感到高兴...... (5认同)
  • 我们应该有一个实例`Num b => Num(a - > b)`.在数学中,在Haskell中我们编写`const 2`的函数几乎总是被称为`2`,并且在支持正确重载的语言中我们没有历史上将数值类型提升为函数是愚蠢的.数字层次仍然被打破,因为`Num`仍然是大的.(我希望标准有类似`AdditiveMonoid`,`AdditiveGroup`,`AdditionCommutes`,`Ring`等) (4认同)