私が Haskell について読んだことと、GHC で行った実験に基づくと、Haskell には戻り値の型のオーバーロード (アドホック ポリモーフィズム) があるようです。この一例は、結果が使用される場所に応じてまたはfromInteger
を与えることができる関数です。例えば:Double
Integer
fd :: Double -> String
fd x = "Double"
fi :: Integer -> String
fi x = "Integer"
fd (fromInteger 5) -- returns "Double"
fi (fromInteger 5) -- returns "Integer"
Haskell への穏やかな紹介は、次のように述べている場合、これに同意しているようです。
これまで説明してきた種類のポリモーフィズムは、一般にパラメトリック ポリモーフィズムと呼ばれます。オーバーロードとしてよく知られている、アドホック ポリモーフィズムと呼ばれる別の種類があります。アドホック ポリモーフィズムの例を次に示します。
- リテラル 1、2 などは、固定精度整数と任意精度整数の両方を表すためによく使用されます。
数値リテラルがアドホック ポリモーフィズム (別名オーバーロード) の例であると見なされる場合、 のような関数の結果についても同じことが当てはまるようfromInteger
です。
実際、Haskell が戻り値の型によるオーバーロードを行っていることを示唆する、スタック オーバーフローに関する他の質問に対する回答をいくつか見つけました。
ただし、少なくとも 1 人の Haskell プログラマーは、これは戻り値の型のオーバーロードではなく、「パラメーターが全称量指定子によってバインドされるパラメトリック ポリモーフィズム」の例であると私に言いました。
彼が得ているのは、 (非決定論的なタイプの)すべてのインスタンスから値を返すことだと思います。fromInteger
Num
これは妥当な解釈のように思えますが、私が知る限り、Haskell ではこれらのインスタンス値を複数見ることはできません (モノモーフィズムの制限のおかげもあります)。また、私たちが見ている値の実際のインスタンスは静的に決定できるようです。fd (fromInteger 5)
このすべてのことから、式の部分式は 型であるのに対し、式の部分式fromInteger 5
は 型Double
でfi (fromInteger 5)
あるfromInteger 5
と言うのが妥当であるように思われInteger
ます。
では、Haskell には戻り値の型のオーバーロードがありますか?
そうでない場合は、次のいずれかの例を提供してください。
- Haskell に戻り値の型のオーバーロードがある場合、異なる動作をする有効な Haskell コード
- Haskell に戻り値の型のオーバーロードがある場合は無効になる有効な Haskell コード
- Haskell に戻り値の型のオーバーロードがある場合に有効な無効な Haskell コード