8

関数型言語の標準ライブラリ (またはプレリュード) について考えています。

Ordのインスタンスがnある場合、実装するのは簡単absです:

abs n = if n > 0 then n else (-n)

ベクトル空間の場合、ベクトルの絶対値 (長さ) は非常に重要です。ただし、ベクトルの絶対値はベクトルではなく、実数であるため、型は一致しません。

abs(またはsignum) を型クラスの一部として持つ設計上の根拠は何Numですか?

4

1 に答える 1

10

ベクトルは良い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

タイトルの質問に答えるにはabsNum. 数値プレリュードには、完全に別のクラスとしてそれがあります。これにより、たとえばベクトルを他の num-classes のインスタンスにすることもできますが、のインスタンスにすることはできませんAbsolute.C。欠点は、これによりクラス階層がはるかに複雑になり、多くの場合、努力する価値がないことです。

于 2013-09-12T07:03:26.703 に答える