Haskellのreturn-type-(only)-polymorphismは良いことですか?
Haskellで私がまったく思いつかなかったことの1つは、次のように、入力型では戻り型を決定できない多相定数と関数をどのように持つことができるかということです。 class Foo a where foo::Int -> a 私はこれが好きではない理由のいくつか: 参照の透明性: 「同じ入力が与えられたHaskellでは、関数は常に同じ出力を返します」が、それは本当ですか?コンテキストでread "3"使用すると3を返しIntますが、たとえば(Int,Int)コンテキストで使用するとエラーをスローします。はい、あなたはそれreadも型パラメータを取っていると主張することができますが、型パラメータの暗黙性は、私の意見ではその美しさの一部を失うことになります。 単相性の制限: Haskellで最も厄介なことの1つ。私が間違っている場合は修正してください。しかし、MRの全体的な理由は、共有されているように見える計算は、型パラメーターが暗黙的であるためではない可能性があることです。 デフォルトのタイプ: 繰り返しになりますが、Haskellで最も厄介なことの1つです。たとえば、出力で多相関数の結果を入力で多相関数に渡す場合に起こります。繰り返しますが、間違っている場合は修正してください。ただし、入力タイプ(および多態定数)で戻り値のタイプを判別できない関数がなければ、これは必要ありません。 だから私の質問は(「議論の質問」としてスタンプされるリスクを実行している):型チェッカーがこれらの種類の定義を許可しないHaskellのような言語を作成することは可能でしょうか?もしそうなら、その制限の利点/欠点は何でしょうか? 私はいくつかの差し迫った問題を見ることができます: 、たとえば、場合2のみのタイプを持っていたInteger、2/3現在の定義ではもうチェックを入力しないでしょう/。しかし、この場合、機能的な依存関係を持つ型クラスが助けになると思います(はい、これは拡張機能であることがわかります)。さらに、入力タイプが制限されている関数を使用するよりも、異なる入力タイプを使用できる関数を使用する方がはるかに直感的であると思いますが、ポリモーフィック値をそれらに渡すだけです。 []およびのNothingような値の入力は、クラックするのが難しいナットのように思えます。私はそれらを処理する良い方法を考えていません。