【发布时间】:2013-02-04 16:05:32
【问题描述】:
我知道,对于具有 Num 类型类的实例的类型,必须有一个来自 Eq 和 Show 的实例
class (Eq a, Show a) => Num a
我想知道为什么它必须是 Eq 而不是 Ord。数字类型在Eq 中但不在Ord 中是否有意义?
【问题讨论】:
我知道,对于具有 Num 类型类的实例的类型,必须有一个来自 Eq 和 Show 的实例
class (Eq a, Show a) => Num a
我想知道为什么它必须是 Eq 而不是 Ord。数字类型在Eq 中但不在Ord 中是否有意义?
【问题讨论】:
例如,复数可以进行加法、减法、乘法和相等性检验,但不能排序。请参阅基础中 Data.Complex 中的Complex a。
【讨论】:
Set.fromList [1 :+ 1] 工作,以及Map.fromList [(1 :+ 1, 1)] 工作。我还要说它对于搜索值很有用,因为排序很容易搜索(对于人类和计算机(二进制搜索))。
请注意,Eq 和 Show 约束也被广泛认为是错误功能。例如,对于包含函数的事物,它们会阻止 Num 的完全有效实例。在最新版本的 GHC 中,这些约束也被删除,Num 完全没有超类约束。
【讨论】:
Num b => Num (a -> b)。在数学中,我们在 Haskell 中编写的函数 const 2 几乎总是被称为 2,而且在支持适当重载的语言中,我们历史上没有将数字类型提升为函数是很愚蠢的。数字层次结构仍然被破坏,因为Num 仍然很大。 (我希望标准有 AdditiveMonoid、AdditiveGroup、AdditionCommutes、Ring 等类)
liftA2 (+) 做了什么......