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

Bol*_*eth 8 haskell typeclass

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

如果我有Ord实例n,那么实现它是微不足道的abs:

abs n = if n > 0 then n else (-n)
Run Code Online (Sandbox Code Playgroud)

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

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

lef*_*out 10

矢量不是好的Num候选者.那里有一个专门的课程.

但是,Num有很多有用的情况下对其中有没有Ord.基本上,(Num, Ord) ? Real在Haskell,这暗示相当清楚,明显的非奥德类型是更高分代数,foremostly Complex.在这里,abs又是不是很完美的,因为它可以返回一个实数,但这些都是复平面返回的子集,Complex是不是错了.

其他示例是更抽象的类型,例如

instance (Num n) => Num (a->n) where
  f+g = \x -> f x + g x
  ...
  abs f = abs . f
Run Code Online (Sandbox Code Playgroud)

这不Ord只是因为你无法充分评估的功能,只是它的返回值.(这也防止一个Eq实例,因此这是不合法在Haskell98其中Eq是的超类Num).

为了ADRESS在标题的问题:这是一个有点争议,是否是把一个好主意absNum.该数字前奏有它作为一个完整的独立的类,它允许你做出如也向量其他NUM类的实例,但不是的Absolute.C.缺点是这会导致更复杂的类层次结构,这通常不值得付出努力.