関数型言語の標準ライブラリ (またはプレリュード) について考えています。
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単に関数を完全に評価できないからではなく、その戻り値だけを評価するためです。(これはまたインスタンスを妨げるので、これはが のスーパークラスであるEqHaskell98 では合法ではありません)。EqNum
タイトルの質問に答えるにはabs、Num. 数値プレリュードには、完全に別のクラスとしてそれがあります。これにより、たとえばベクトルを他の num-classes のインスタンスにすることもできますが、のインスタンスにすることはできませんAbsolute.C。欠点は、これによりクラス階層がはるかに複雑になり、多くの場合、努力する価値がないことです。