8

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

如果我有Ord实例n,那么实现起来很简单abs

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

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

abs将(或signum)作为类型类的一部分的设计原理是什么Num

4

1 回答 1

10

向量不是很好的Num候选者。有专门的课程

但是Num有许多有用的实例没有Ord. 基本上,(Num, Ord) ≈ Real在 Haskell 中,它非常清楚地暗示了明显的非 Ord 类型是更高的除法代数,首先是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数字前奏将它作为一个完整的单独类,它允许您将例如向量作为其他 num-classes 的实例,但不是Absolute.C. 缺点是这会导致更复杂的类层次结构,这通常是不值得的。

于 2013-09-12T07:03:26.703 回答