関数型言語の標準ライブラリ (またはプレリュード) について考えています。
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
。欠点は、これによりクラス階層がはるかに複雑になり、多くの場合、努力する価値がないことです。