文字列で定義することでし(+)
たが、のインスタンスを指定することではないとしますNum String
。
Haskellが関数を非表示にするNum
のはなぜですか?(+)
結局のところ、私が提供した機能は次のとおりです。
(+) :: String -> String -> String
コンパイラによってプレリュードと区別することができます(+)
。両方の関数が同じ名前空間に存在できないのに、重複しない型シグネチャが異なるのはなぜですか?
コード内に関数の呼び出しがない限り、Haskellはあいまいさが存在することに注意します。引数を使用して関数を呼び出すと、適切な実装を選択できるようにタイプが決定されます。
もちろん、インスタンスNum String
が存在すると、実際には競合が発生します。その時点で、Haskellは、関数が実際に呼び出された場合、どの実装を選択するかをパラメータータイプに基づいて決定できなかったためです。
その場合、エラーが発生するはずです。
これにより、落とし穴やあいまいさを伴わずに関数のオーバーロードが可能になりませんか?
注:動的バインディングについては話していません。