問題タブ [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でポリモーフィック値が推測されないのはなぜですか?
数値リテラルにはポリモーフィック型があります。
しかし、変数をそのようなリテラルにバインドすると、ポリモーフィズムは失われます。
一方、関数を定義すると、もちろん多形になります。
型署名を提供して、x
残差が多形であることを確認できます。
しかし、なぜこれが必要なのですか?ポリモーフィック型が推測されないのはなぜですか?
haskell - XNoMonomorphismRestriction とは?
このページの使い方
$ ghci -XNoMonomorphismRestriction
haskell インタプリタを起動します。
XNoMonomorphismRestriction
switch とはどういう意味ですか?
haskell - アンカリー関数を使用した特定の型推論
uncurry
GHCiの機能で遊んでいたのですが、なかなか手に入らないものを見つけました。関数に適用uncurry
し、(+)
それを以下のコードのように変数にバインドすると、コンパイラーはその型が特定のものであると推測しますInteger
。
ただし、次の式のタイプを尋ねると、正しい結果が得られます(私が期待するもの)。
何が原因でしょうか?それはGHCiに特有ですか?
同じことが。にも当てはまりますlet add' = (+)
。
注:コンパイルされたファイルを使用してそれを再現することはできませんでした。
haskell - 関数をポイントフリースタイルに変換すると、そのタイプが変更されます
私はHaskellを始めています...私はHaskellに型を決定させるという2つの異なる方法で次の自明な関数を書こうとしました、そして型システムはそれぞれの場合で何か違うことをします。その振る舞いの説明は何ですか?
ありがとう!
haskell - Haskell の型推論の奇妙さ
ghci からの次の出力を見てください。
look
の推定型が の型と異なるのはなぜflip Data.Map.lookup
ですか?
あなたにいくつかの文脈を与えるために。最初は小さなプログラムがあり、コンパイラエラーが発生する理由を理解しようとしていました:
Ghci の反応:
このバリエーションはうまくコンパイルできることがわかりました (型定義は同じです)。
そして、いくつかの実験の後、 type of をlook
明示的に配置すると、最初のバージョンもうまくコンパイルされることが判明しました。
それが私の最初の質問につながります。
haskell - Haskellで3とx(3が割り当てられている)の推定型が異なるのはなぜですか?
Haskellの型推論には、少し学習曲線があります(控えめに言っても!)。それを学び始める良い方法は、簡単な例を使うことです。したがって、以下は型推論の「HelloWorld」のビットです。
次の例を考えてみましょう。
したがって、問題は次のとおりです。3とxのタイプが異なるのはなぜですか。
リンクの概要:
完全なストーリーについては、以下の回答をお読みください。ここにリンクの要約があります:
- GHCタイプのデフォルト:Haskellレポートセクション4.3.4
- GHCiの拡張タイプのデフォルト:GHCiセクション2.4.5の使用
- 単形制限:Haskell wiki
haskell - 型クラス制約に対するモノモーフィズム制限の効果
baz
の型宣言が追加されると、このコードは壊れます。
一般的な説明 (例については、推論された型を宣言できないのはなぜですか?を参照) は、多相再帰が原因であるというものです。
しかし、その説明は、別のポリモーフィックな再帰的な例で効果が消える理由を説明していません:
また、GHC が再帰が型宣言なしで単相的であると考える理由も説明していません。
http://www.haskell.org/onlinereport/decls.html#sect4.5.5reads
の例の説明は私のケースに適用できますか?baz
つまり、署名を追加すると、単一型の制限が取り除かれ、制限がないと、右辺 [] のあいまいさが現れ、「本質的にあいまいな」タイプのforall a . Eq a => [a]
?
haskell - 関数を別の名前にバインドできるのはいつですか?
インタプリタで作業するときは、関数を名前にバインドすると便利なことがよくあります。次に例を示します。
f
これにより、名前が関数にエイリアスされます(+1)
。単純。
ただし、これが常に機能するとは限りません。nub
エラーの原因となる1つの例は、Data.List
モジュールからエイリアスを作成しようとしていることです。例えば、
ただし、引数を明示的に指定すると、x
エラーなしで機能します。
誰かがこの行動を説明できますか?
haskell - 状態モナドを使用して明示的な状態を隠す
私は Haskell で小さなゲームを書こうとしていますが、渡すためにかなりの量の状態が必要です。Stateモナドで状態を隠してみたい
今、私は問題に遭遇しました: 状態と引数を取る関数は、状態モナドで動作するように書くのは簡単でした. しかし、引数として状態を受け取るだけの関数もあります (そして、変更された状態、またはおそらく何か他のものを返します)。
コードの一部に、次の行があります。
状態を取らず、代わりに書きたい
現在、その実装は次のようになっています
そして、次のように書くことで State モナドで動作させるのに十分簡単に思えました:
しかし、それはghcからの苦情を引き起こします! 「get」の使用に起因する (MonadState GameState m0) のインスタンスはありません。State モナド形式で nullary でないことを除いて、非常によく似た関数を既に書き直していたので、直感で次のように書き直しました。
そして確かに、それは機能します!しかし、もちろん getCurrentPlayerM () として呼び出す必要があり、それを行うのは少しばかげています。そもそも言い争いは避けたかった!
追加の驚き: ghci でそのタイプを見ると、
しかし、コードでそれを明示的に設定しようとすると、別のエラーが発生します。「制約 MonadState GameState m の非型変数引数」と、それを許可する言語拡張の提案です。私の GameState は型であり、型クラスではないためだと思いますが、実際には受け入れられているのに、それについて明示しようとすると受け入れられない理由は、もっと混乱しています。
要約すると:
- Stateモナドにnullary関数を書けないのはなぜですか?
- 回避策関数が実際に持っている型を宣言できないのはなぜですか?
haskell - NoMonomorphismRestriction は共有を維持するのに役立ちますか?
この奇妙な動作に遭遇したとき、ポリモーフィズムと共有に関する別の質問に答えようとしていました。
GHCi では、多相定数を明示的に定義すると、共有が行われません。これは理解できます。
一方、型シグネチャを省略してモノモーフィズムの制限を無効にすることで同じことを達成しようとすると、定数が突然共有されます!
どうして?!
うーん...最適化してコンパイルすると、モノモーフィズムの制限が無効になっていても高速です。