問題タブ [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 - フォールバック インスタンスを書き込もうとしたときの重複インスタンス エラー
オーバーラップ動作を持つインスタンスを定義するために、高度なオーバーラップトリックに似たようなことをしようとしています。フィールドが存在する場合はフィールドのインスタンスを使用するタプルのインスタンスを派生させようとしていますfst
。そうでない場合は、フィールドが存在する場合はそのインスタンスを使用しますsnd
。これにより、最終的に、重複するインスタンスに関する誤ったエラーが表示されます。
まず、キッチンのシンクは 以外は全部使っていOverlappingInstances
ます。
また、ポリカインドProxy
とタイプ レベル orを使用してい:||:
ます。
A
で遊ぶのは非常に単純なクラスです。インスタンスThingA
があります。しません。A
ThingB
次の部分の目標は、またはインスタンスがある限り定義されるA
インスタンスを作成することです。インスタンスがあれば、 を返します。インスタンスがなくてもインスタンスがある場合は、を返します。(x, y)
A x
A y
A x
("fst " ++) . traceA . fst
A x
B x
("snd " ++) . traceA . fst
A
最初のステップは、インスタンス ヘッドと照合することにより、インスタンスがあるかどうかをテストする機能依存関係を作成することです。これは、高度なオーバーラップの記事からの通常のアプローチです。
両方にインスタンスがあるかどうかを判断できればx
、インスタンスがあるかどうかを判断できます。y
A
(x, y)
ここで、高度なオーバーラップの単純な例から離れて、インスタンスA x
またはA y
インスタンスを使用するかどうかを選択するための 2 つ目の機能依存関係を紹介します。( との混同を避けるために、 Bool
forChooses
および とは異なる種類を使用できます。)SwitchA
APred
インスタンスがあるA x
場合は常に を選択'True
し、そうでない場合は'False
.
次に、高度なオーバーラップの例と同様に、選択用の追加の型変数とすべてのメンバーの引数をA
除いてと同じクラスを定義します。Proxy
これはインスタンスを定義するのが簡単です
SwitchA
最後に、と同じ型のインスタンスがあれば、インスタンス(x, y)
Chooses
を定義できA (x, y)
ます。
ここまでのすべてが見事にコンパイルされます。ただし、追加しようとすると
次のエラーが表示されます。
何が起きてる?のインスタンスを探すときにこれらのインスタンスが重複するのはなぜですかChooses 'True ...
。であることがすでにわかっているinstance flag ~ 'False => Chooses flag ...
場合、インスタンスが一致しないはずはありませんか?flag
'True
逆に試してみると
エラーが発生します
コンパイラに、意図されていないことを実行させようとしたときに何が起こっているのかについての洞察は役に立ちます。
編集 - 単純化
この回答からの観察に基づいて、Chooses
完全に取り除き、書くことができます
これにより、次の問題が解決されます。traceA (ThingB, ThingA)
haskell - 型クラスのインスタンスを自動的に別のインスタンスにする
私が達成したいのは、次のクラス ( SampleSpace
) のインスタンスは自動的に のインスタンスになることです。これは、文字列表現を作成するために必要なインターフェイス全体が含まれているShow
ためSampleSpace
、クラスのすべての可能なインスタンスが実質的に同一になるためです。
私がすでに知っているように、インスタンス宣言を一致させている間、GHC は制約ではなく頭だけを見ており、Show (s a)
Rational についても同様であると信じています:
質問: (インスタンスのオーバーラップを有効にする以外に) 型クラスの任意のインスタンスを自動的に別のインスタンスにすることは可能ですか?
class - 3 回目の試行 - 別のインスタンスを上書きするクラス インスタンス
問題は、2 番目のファイルをロードするボタンが押されたときに、クラス インスタンス LowE が MedE で上書きされることです。
プロジェクトコード全体を投稿せずにこの質問をしようとしましたが、成功しませんでした。
ファイル runData.h
(MAXPOINTS,7); 静的配列 ^fData1 = gcnew 配列 (MAXPOINTS,7);
ファイル Form1.h
pragma endregion
プライベート: System::Void cbx_WellPlateList_SelectedIndexChanged(System::Object^ sender, System::EventArgs^ e) {
if (!sr) { tbx_File1->Text = "ファイルを開けませんでした。";
}
private: System::Void btnFile2_Click(System::Object^ sender, System::EventArgs^ e) {
if (!sr) { tbx_File2->Text = "ファイルを開けませんでした。";
}
private: System::Void btnFile3_Click(System::Object^ sender, System::EventArgs^ e) {
if (!sr) { tbx_File3->Text = "ファイルを開けませんでした。";
}
private: System::Void btn_Exit_Click(System::Object^ sender, System::EventArgs^ e) {
private: System::Void btn_Graph1_Click(System::Object^ sender, System::EventArgs^ e) {
private: System::Void btn_Graph2_Click(System::Object^ sender, System::EventArgs^ e) {
private: System::Void btn_Graph3_Click(System::Object^ sender, System::EventArgs^ e) {
private: System::Void btn_Create_Click(System::Object^ sender, System::EventArgs^ e) {
};
// newData = *データ;
// runData 塗りつぶされたデータ; // = (新しい runData);
うまくいけば、これで十分な情報です。
問題は、2 番目のファイルをロードするボタンが押されたときに、クラス インスタンス LowE が MedE で上書きされることです。
haskell - メソッドを存在的に定量化しない場合の重複インスタンスエラーの理由
次のコードの場合forall a r
、 の型からの削除はgo
「Typeable (D r) の重複するインスタンス」で失敗します。なぜだろう?
エラーには、「選択はのインスタンス化に依存します」とも書かれていますが、r
それは提供されたによって固定されていませんProxy r
か?
haskell - Haskell の 7.10 のように 7.8 で重複/重複可能を指定できますか?
どのインスタンスがオーバーラップしているか、どのインスタンスが ghc 7.8 OverlappingInstances とオーバーラップ可能かを指定することは可能ですか?
servant/servant-server パッケージにいくつかの更新/変更を加えようとしています。この変更を追加する前にパスしていた 1 つの doctest を除いて、すべてが正常にコンパイルされ、すべてのテストがパスします。doctest は ghc 7.8 でのみ失敗し、ghc 7.10 でパスします。これは、ghc 7.10 でどのインスタンスが重複しているか、どのインスタンスが重複可能かを指定できるという事実に関連していると思います。これをghc 7.8で達成するにはどうすればよいですか? どんなアイデア/ポインタも大歓迎です。以下は、ghc 7.8 で発生した doctest と失敗のエラーです。
haskell - OverlappingInstances を使用してより適切なエラー メッセージを取得できますか?
私は現在、私が書いたのではなく、変更を加えたいくつかの Haskell コードを扱っています。変更後、プログラムを実行すると、次のエラー メッセージが表示されます。
への呼び出し!!
は私のコードには含まれていないため、回避できれば、それをリファクタリングするのはやりたいことよりも多くの作業になります。
私がしたいのは、次のようなことです:
つまり、関数!!
は考えられるすべてのリスト タイプに対して定義されますが、要素タイプに対して Show インスタンスが定義されるたびに異なる動作をします。
あるいは、tryShow :: a -> Maybe String
メソッドもこのトリックを実行します。
これを行う方法はありますか?Show の実装が適用されない場合にのみ、OverlappingInstances にデフォルトの実装を使用させることはできますか? これは保証された動作ですか?
編集:エラーを取得してスタックトレースのようなメッセージを出力できる人にはボーナスポイント!
haskell - 一貫性のないインスタンスを必要とするにもかかわらず、常に「正しい」インスタンスを選択するように見える奇妙なプログラムですか?
次のプログラムを考えてみましょう。これは、一貫性のないインスタンスを有効にしてコンパイルするだけです。
一貫性のないインスタンスなしでコンパイルすると、複数のインスタンスが一致すると主張します。これは、一貫性のないインスタンスが許可されている場合、インスタンスが任意に選択されることを暗示しているように思われます。
非常に幸運でない限り、ほとんどの場合、インスタンスの制約が満たされないため、コンパイル エラーが発生します。
しかし、一貫性のないインスタンスではコンパイルエラーは発生せず、実際に「正しい」インスタンスが選択された次の出力が得られます。
したがって、ここでいくつかのことのいずれかを結論付けることができます。
- GHC は、インスタンス コンテキストの失敗を後戻りしています (独自のドキュメントには記載されていません)。
- GHC は一致するインスタンスが 1 つしかないことを実際に認識していますが、一貫性のないインスタンスをオンにしない限り、それを使用する勇気はありません。
- 私は非常に幸運でした (1/3 3 = 27 チャンス)
- 何か他のことが起こっています。
答えは 4 だと思います (おそらく 2 と組み合わせる)。ここで何が起こっているのかを説明する答えが欲しいのですが、一貫性のないインスタンスでこの動作にどれだけ頼ることができますか? 信頼できる場合、この動作を使用して非常に複雑なクラス階層を作成できるように思われます。これは、実際にはサブタイピングのように動作します。たとえば、クラス A とクラス B のすべての型がクラス C にあり、インスタンス ライターがインスタンスを作成できると言えます。 C のインスタンスを明示的に作成しなくても A.
編集:
答えはGHCのドキュメントでこれと関係があると思われます:
- ターゲット制約に一致するすべてのインスタンス I を見つけます。つまり、ターゲット制約は I の置換インスタンスです。これらのインスタンス宣言が候補です。
- 次の両方が成り立つ候補 IX を除外します。
- 厳密により具体的な IY 候補がもう 1 つあります。つまり、IY は IX の置換インスタンスですが、その逆ではありません。
- IX が重複可能であるか、または IY が重複しています。(「両方/および」の設計ではなく、この「どちらか/または」の設計により、クライアントは、ライブラリを変更する必要なく、ライブラリからインスタンスを意図的にオーバーライドできます。)
一貫性のない候補が 1 つだけ残っている場合は、それを選択します。残りの候補がすべて矛盾している場合は、任意の候補を選択します。そうでない場合、検索は失敗します (つまり、複数の生き残った候補が矛盾していない場合)。
(前のステップから) 選択された候補が矛盾している場合、検索は成功し、その候補が返されます。
そうでない場合は、ターゲットの制約と一致するが一致しないすべてのインスタンスを見つけます。このような非候補インスタンスは、ターゲット制約がさらにインスタンス化されたときに一致する可能性があります。それらのすべてが矛盾している場合、検索は成功し、選択された候補が返されます。そうでない場合、検索は失敗します。
間違っている場合は訂正してください。ただし、一貫性のないインスタンスが選択されているかどうかに関係なく、最初のステップでは「一致する」インスタンスは 1 つだけです。一貫性のないケースでは、ステップ 4 でその「一致した」ケースで失敗します。しかし、非一貫性のケースでは、ステップ 4 に進み、1 つのインスタンスのみが「一致」しているにもかかわらず、他のインスタンスが「統合」されていることがわかります。 . だから私たちは拒否しなければなりません。
この理解は正しいでしょうか?
もしそうなら、誰かが「一致」と「統一」の意味と、それらの違いを正確に説明できますか?