为什么Num类型类有abs方法?

时间:2013-09-12 06:43:10

标签: haskell typeclass

我正在考虑功能语言的标准库(或前奏)。

如果Ordn个实例,那么实施abs是微不足道的:

abs n = if n > 0 then n else (-n)

在向量空间的情况下,向量的绝对值(长度)非常重要。但是类型不匹配,因为向量的绝对值不是向量:它是实数。

abs(或signum)作为Num类型类的一部分,背后的设计理由是什么?

1 个答案:

答案 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中这是不合法的,其中EqNum的超类。

要解决标题中的问题:将abs放入Num是否是一个好主意是有争议的。 numeric preludea complete seperate class设为{{3}},您可以将其设为还导出其他num-class的实例,但不是Absolute.C的实例。缺点是这会导致更复杂的类层次结构,这通常不值得付出努力。