GrahamHuttonの著書「ProgramminginHaskell」で、彼は、その型が「1つ以上の型変数を含む」場合、関数をpolymorphicと定義しています。次に、その型が「1つ以上のクラス制約を含む」場合、関数をoverloadedと定義します。
これらの定義から、私の質問は、「関数を多態性および過負荷にすることができますか? -)?」。
たとえば、標準プレリュードの関数elem
は、基本的にEq a => [a] -> Bool
のタイプを持っています。この関数はpolymorphicとoverloadedの両方であると言えますか?
編集:
グラハム・ハットンは、「クラス制約は変数の型指定にのみ使用できるので、私の答えはイエスです。関数はポリモーフィックとオーバーロードの両方で呼び出すことができます。特に、オーバーロードされた関数はこれらの定義によってポリモーフィックでもあります。しかし、私は理解できます。なぜ誰かがこれらの2つの用語を区別したいと思うかもしれません。本の目的のために、私は明確で単純な定義を持ちたかったのです。」
Haskell Wikiページ 、elem
は「アドホック多相」の例であり、id :: a -> a
のようなものは「パラメトリック多相」の例であると述べています。
はい。定義に従うと、答えは簡単です。 A => BおよびC => Dの場合、A⋀C=>B⋀D
「オーバーロードされた」関数はポリモーフィックである必要があります。これは、関数のシグネチャに型変数がすでに含まれていない限り、クラス制約を記述できないためです。これに基づいて、私はoverloadedがHaskellで非常に有用な概念であるとは言いません。