我正在考虑功能语言的标准库(或前奏)。
如果Ord
有n
个实例,那么实施abs
是微不足道的:
abs n = if n > 0 then n else (-n)
在向量空间的情况下,向量的绝对值(长度)非常重要。但是类型不匹配,因为向量的绝对值不是向量:它是实数。
将abs
(或signum
)作为Num
类型类的一部分,背后的设计理由是什么?
答案 0 :(得分:10)
向量不是好Num
个候选者。有a dedicated class for those。
但是Num
有许多有用的实例,没有Ord
。基本上,Haskell中的(Num, Ord) ≈ Real
,非常清楚地暗示明显的非Ord类型是较高的division algebras,最重要的是Complex
。在这里,abs
也不是很完美,因为它可以返回一个实数,但由于它们是复平面的一个子集,因此返回Complex
不是错误的。
其他示例是更抽象的类型,例如
instance (Num n) => Num (a->n) where
f+g = \x -> f x + g x
...
abs f = abs . f
不是Ord
,因为您无法完全评估函数,只能评估其返回值。 (这也会阻止Eq
实例,因此在Haskell98中这是不合法的,其中Eq
是Num
的超类。
要解决标题中的问题:将abs
放入Num
是否是一个好主意是有争议的。 numeric prelude将a complete seperate class设为{{3}},您可以将其设为还导出其他num-class的实例,但不是Absolute.C
的实例。缺点是这会导致更复杂的类层次结构,这通常不值得付出努力。