我正在考虑功能语言的标准库(或前奏).
如果我有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在标题的问题:这是一个有点争议,是否是把一个好主意abs
的Num
.该数字前奏有它作为一个完整的独立的类,它允许你做出如也向量其他NUM类的实例,但不是的Absolute.C
.缺点是这会导致更复杂的类层次结构,这通常不值得付出努力.