問題タブ [overlapping-instances]
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 - 自分の型クラスのすべての型に対して (Show のような) 型クラスのインスタンスを宣言する方法は?
私は型クラスを持っています:
あまり役に立たないように見えますが、意味的に異なる種類のsを (type
同義語だけでなく) 強く区別するために使用しています。Map String Int
クラスの任意のタイプで動作する関数がまだあります。
- この区別を行うためのより良い方法はありますか (おそらく
Wrapper
インスタンスのボイラープレートなしで)?
私はこれをしたい:
多くのボイラープレートShow
インスタンスも記述する代わりに。
と を介しFlexibleInstances
てUndecidableInstances
、GHC は私のインスタンス宣言がすべてに適用されると考える点に私を導きShow
ますGHC.Show
。HaskellWiki と StackOverflow の回答者と HaskellWikiOverlappingInstances
は、完全に安全ではなく、混乱を招く可能性があると確信しています。GHCはそれを示唆していません。
なぜ GHC は最初に fx のどのインスタンス
Show Int
を選択すればよいかわからないことに文句を言い (それで、なぜコンパイル時に与えた制約を調べないのですか?)、次に、インスタンスがオーバーラップする可能性があると言われ、突然何をすべきかを知ってしまうのでしょうか?OverlappingInstances
で許可を避けることはできますnewtype
か?
haskell - Haskell/GHC: 重複するインスタンスが報告されましたが、コンテキストでは単一のインスタンスしか許可されていません
親愛なる Haskell/GHC 専門家の皆様
提供されたコンテキストに従って実際に有効なのは1つだけなのに、GHCが重複するインスタンスを報告する理由がよくわかりません。たとえば、次のコードを考えてみましょう。
それをコンパイルすると、次のようになります。
ポイントは、のインスタンスではない('a', True)
型を持つことです。したがって、値には適用されません。(Char, Bool)
C
instance C a => C [a]
[('a', True)]
では、なぜGHCはそれを考慮するのでしょうか?
問題は、問題を回避する方法 (例: を使用) ではなく、GHC の動作を理解することOverlappingInstances
です。関数呼び出しを「解決」するときにコンテキストが使用されていないためですか?もしそうなら、なぜですか?
前もって感謝します!
haskell - Haskell での型変数依存のデフォルト メソッドの実装
クラスの型変数が特定の他のクラスを派生させる場合にのみ、デフォルトのメソッド実装を定義しようとしています。
を使用して型依存インスタンスを作成しようとしましたが=>
(正しく使用していますか?)、「重複インスタンス宣言エラー」が発生します: ( https://repl.it/@solly_ucko/Distributions )
次に、実際のインスタンスを追加しようとすると (コンパイラがその時点に到達できるように、以前に作成した「インスタンス」の一部をコメントアウトします)、競合するインスタンスに関するエラーが表示されます。
明確にするために、私の目標は for probability
and values
be defined for all Distributions
、および for all for all値を導出するprobabilityOfRange
ように定義することです。また、追加の制約が満たされたときにデフォルトを提供したいと考えています。これがなければ、(他の方法に基づく) 合理的なデフォルトは不可能だからです。Distributions
Ord