我正在考虑功能语言的标准库(或前奏)。
如果我有Ord
实例n
,那么实现起来很简单abs
:
abs n = if n > 0 then n else (-n)
在向量空间的情况下,向量的绝对值(长度)非常重要。但是类型不匹配,因为向量的绝对值不是向量:它是实数。
abs
将(或signum
)作为类型类的一部分的设计原理是什么Num
?
向量不是很好的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
. 缺点是这会导致更复杂的类层次结构,这通常是不值得的。