web-dev-qa-db-ja.com

関数を多形にしてオーバーロードすることはできますか?

GrahamHuttonの著書「ProgramminginHaskell」で、彼は、その型が「1つ以上の型変数を含む」場合、関数をpolymorphicと定義しています。次に、その型が「1つ以上のクラス制約を含む」場合、関数をoverloadedと定義します。

これらの定義から、私の質問は、「関数を多態性および過負荷にすることができますか? -)?」。

たとえば、標準プレリュードの関数elemは、基本的にEq a => [a] -> Boolのタイプを持っています。この関数はpolymorphicoverloadedの両方であると言えますか?

編集:

グラハム・ハットンは、「クラス制約は変数の型指定にのみ使用できるので、私の答えはイエスです。関数はポリモーフィックとオーバーロードの両方で呼び出すことができます。特に、オーバーロードされた関数はこれらの定義によってポリモーフィックでもあります。しかし、私は理解できます。なぜ誰かがこれらの2つの用語を区別したいと思うかもしれません。本の目的のために、私は明確で単純な定義を持ちたかったのです。」

Haskell Wikiページelemは「アドホック多相」の例であり、id :: a -> aのようなものは「パラメトリック多相」の例であると述べています。

3
Ryan Smith

はい。定義に従うと、答えは簡単です。 A => BおよびC => Dの場合、A⋀C=>B⋀D

0
sara

「オーバーロードされた」関数はポリモーフィックである必要があります。これは、関数のシグネチャに型変数がすでに含まれていない限り、クラス制約を記述できないためです。これに基づいて、私はoverloadedがHaskellで非常に有用な概念であるとは言いません。

4
Ryan Reich