問題タブ [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.
haskell - ファンクターの Haskell 型推論
最近、私は Haskell、特にファンクタの概念全体をいじっています。飛び込むほど、a-haの瞬間が増え、ドーパミン受容体がかなりくすぐられます.
私が立ち往生している問題は次のとおりです。機能するコードは次のとおりです。関数を持ち上げて、最初に IO 値に適用し、次にリストに適用します。
より簡潔な方法でそれを書くことは非常に魅力的です。つまり:
私の一部は、IO と List インスタンスの両方に適用できるはずなので、概念的に正しいと言っていreplicator
ますが、強く型付けされた言語である Haskell ではそうすることができません。なぜこのようなことが起きているのか、おおむね理解できたと思います。
問題は、後者のバリアントに近づく方法はありますか? それとも前者と同居していいの?
ありがとうございました!
haskell - 単型性制限とは何ですか?
Haskell コンパイラが、たとえばポイントフリー定義を使用している場合など、予想よりもポリモーフィックではない型を推論することがあることに戸惑っています。
問題は、古いバージョンのコンパイラではデフォルトでオンになっている「モノモーフィズムの制限」にあるようです。
次の haskell プログラムを検討してください。
これをコンパイルするghc
と、エラーは発生せず、実行可能ファイルの出力は次のようになります。
main
ボディを次のように変更した場合:
コンパイル時エラーは発生せず、出力は次のようになります。
予想通り。ただし、次のように変更しようとすると:
タイプエラーが発生します:
sort
異なる型で 2 回呼び出そうとすると、同じことが起こります。
次のエラーが発生します。
- それがポリモーフィックではなく、引数が必要
ghc
だと突然考えるのはなぜですか? への唯一の参照はのアプリケーションにあります。定義が明らかに多態的である場合、それはどのように問題になるのでしょうか?plus
Int
Int
plus
- 突然インスタンスが必要
ghc
だと思うのはなぜですか?sort
Num Char
さらに、関数定義を独自のモジュールに配置しようとすると、次のようになります。
コンパイル時に次のエラーが発生します。
ghc
に多相型を使用できOrd a => [a] -> [a]
ないのはなぜsort
ですか?- そして、なぜ
ghc
扱いplus
がplus'
異なるのですか?plus
はポリモーフィック型である必要があり、Num a => a -> a -> a
これが の型とどのように異なるのかはよくわかりませんが、エラーが発生するsort
だけです。sort
最後に:sort
ファイルの定義にコメントを付けるとコンパイルされます。ただし、それをロードしてghci
取得するタイプを確認すると、次のようになります。
plus
ポリモーフィックの型ではないのはなぜですか?
これは、 meta question で説明されているように、Haskell でのモノモーフィズムの制限に関する正規の質問です。