問題タブ [monomorphism-restriction]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
110 参照

haskell - ファンクターの Haskell 型推論

最近、私は Haskell、特にファンクタの概念全体をいじっています。飛び込むほど、a-haの瞬間が増え、ドーパミン受容体がかなりくすぐられます.

私が立ち往生している問題は次のとおりです。機能するコードは次のとおりです。関数を持ち上げて、最初に IO 値に適用し、次にリストに適用します。

より簡潔な方法でそれを書くことは非常に魅力的です。つまり:

私の一部は、IO と List インスタンスの両方に適用できるはずなので、概念的に正しいと言っていreplicatorますが、強く型付けされた言語である Haskell ではそうすることができません。なぜこのようなことが起きているのか、おおむね理解できたと思います。

問題は、後者のバリアントに近づく方法はありますか? それとも前者と同居していいの?

ありがとうございました!

0 投票する
1 に答える
6859 参照

haskell - 単型性制限とは何ですか?

Haskell コンパイラが、たとえばポイントフリー定義を使用している場合など、予想よりもポリモーフィックではない型を推論することがあることに戸惑っています。

問題は、古いバージョンのコンパイラではデフォルトでオンになっている「モノモーフィズムの制限」にあるようです。

次の haskell プログラムを検討してください。

これをコンパイルするghcと、エラーは発生せず、実行可能ファイルの出力は次のようになります。

mainボディを次のように変更した場合:

コンパイル時エラーは発生せず、出力は次のようになります。

予想通り。ただし、次のように変更しようとすると:

タイプエラーが発生します:

sort異なる型で 2 回呼び出そうとすると、同じことが起こります。

次のエラーが発生します。

  • それがポリモーフィックではなく、引数が必要ghcだと突然考えるのはなぜですか? への唯一の参照はのアプリケーションにあります。定義が明らかに多態的である場合、それはどのように問題になるのでしょうか?plusIntIntplus
  • 突然インスタンスが必要ghcだと思うのはなぜですか?sortNum Char

さらに、関数定義を独自のモジュールに配置しようとすると、次のようになります。

コンパイル時に次のエラーが発生します。

  • ghcに多相型を使用できOrd a => [a] -> [a]ないのはなぜsortですか?
  • そして、なぜghc扱いplusplus'異なるのですか?plusはポリモーフィック型である必要があり、Num a => a -> a -> aこれが の型とどのように異なるのかはよくわかりませんが、エラーが発生するsortだけです。sort

最後に:sortファイルの定義にコメントを付けるとコンパイルされます。ただし、それをロードしてghci取得するタイプを確認すると、次のようになります。

plusポリモーフィックの型ではないのはなぜですか?


これは、 meta question で説明されているように、Haskell でのモノモーフィズムの制限に関する正規の質問です。