問題タブ [implicits]

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 に答える
1481 参照

scala - Scala では型が等しくないという証拠

2 つの型が等しくないことが証明された場合にのみ意味をなすように、メソッドを制約する方法はありますか?

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

scala - Scala で型証拠の存在に応じて分岐する慣用的な方法

私は、次の醜いパターンを何度も書いていることに気づきました。

さらに悪いことに、 のときev != nullは、 などの異端を書くこともありましたsomeB.asInstanceOf[A]

0 投票する
2 に答える
246 参照

scala - 抽象型メンバーで暗黙の値を見つける

のような型trait A[T]では、スコープ内の暗黙的なものを見つけるのは簡単ですimplicitly[A[SomeType]]

これを行うことができますか?もしそうなら、型パラメータが抽象型メンバーに置き換えられた場合、どのように行われtrait A { type T }ますか?

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

scala - 型クラス インスタンスの生成中に、シングルトン型がシングルトン型であることを証明できません

Shapeless 共積のすべての型がシングルトン型であることを証明する型クラスがあるとします。

単純な ADT で動作することを示すことができます。

その後:

これを Shapeless のGenericメカニズムと組み合わせて、ADT の共積表現を提供します。

うまくいくと思いますがimplicitly[EnumerableAdt[Foo]]、うまくいきません。を使用-Xlog-implicitsして、理由に関する情報を取得できます。

Baz.typeただし、明らかにシングルトン型です。楽しみのために、手動でインスタンスをスコープに入れてみることもできWitnessます。

そして、どういうわけか今それは動作します:

Witness.applyこれらのインスタンスがこのコンテキストで機能するのに、(作成に使用した) マクロ メソッドによって生成されたインスタンスが機能しない理由がわかりません。何が起きてる?コンストラクターを手動で列挙する必要がない便利な回避策はありますか?

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

scala - scala での暗黙の解決とそのパラメーターの型の推論

暗黙の解決がどのように機能するか、特にすべての暗黙のパラメーターに対して暗黙が検索される型の推論と順序 (存在する場合) に関して、良い情報源はありますか?

最初に、もちろん私は Scala 言語仕様を読んでいるので、コンパイラーがどこで暗黙を検索するかなどの基本を理解しています (またはそう思う)。しかし、再帰的暗黙のように、もう少し高度なことをしようとすると、常に超自然的な問題に遭遇し、それらを扱うことは実験的な魔法を練習しているように思えます. コンパニオン オブジェクトにすべての暗黙オブジェクトをまとめて保持し、競合に関するすべての困難な問題を排除したとしても、仕様に従ってセマンティクスを変更するべきではないコードのわずかな変更によって、コンパイルする場合とコンパイルしない場合に違いが生じることがあります。

Companionコンパイラが暗黙的な for を見つけることができなかったが、呼び出しの前に導入import Companion._するとコンパイルが行われ、オブジェクト Companion には Companion インスタンスを返す暗黙的な定義しかなかったというケースを覚えています。

コードが次のように構成されている場合がありました。

コンパイルしませんでしたが、暗黙の定義 (ParticularEvidence の唯一のもの) を ParticularEvidence から親 Evidence オブジェクトに移動すると、それらが表示されました。

いくつかの試行錯誤の後、解決ロジックがかなり制限されており、このクラスの構成要素がたとえば次のようになっていることがわかりました。

証拠クラスが型パラメーターに対して不変である場合、そのような暗黙の値が存在する型 Z が 1 つだけ存在する場合でも、ほとんどコンパイルされません。しかし、次のことが問題になる理由がわかりません。

ここでは、ボックス化されたタイプの共用体を試しています (||[A, B] は基本的に、構造の透明な平坦化と非表示の左/右オプションを備えた美化された [Eir] です)。Minus は、実装したい型演算の一部です。最後の行で、SA||SB - Nothing = SA||SB という証拠をコンパイラに提供するよう要求しています。より一般的には、C が A のすべての値を含み、B の値を含まない最小の型である場合にのみ、暗黙的なマイナス [A,B,C] が存在すると予想します。さらに、C がは不明であり、A、B からのみであるため、暗黙の証拠を実装して、任意の型共用体を正規化された形式に自動変換できるようにすることができます。最終的には、正規化された値を提供する暗黙的なメソッドの組み合わせを見つけて、次のようなものを記述できるようにしたいと考えています。

したがって、コンパイラは、暗黙的なメソッドによって適用される一連の規則を利用して、他の部分によって支配されている部分を取り除くことによって共用体型を単純化できるはずです。そのためには、型の集合減算を実装できる必要があります。

私はおそらくこれで敵の領域にいる可能性が高く、これに応じてコンパイラーの変更がプログラム全体を壊す可能性があることを知っていますが、私は主にパズルと概念の証明としてそれを扱います. 何が可能かを理解したら、何が合理的かを考え始めます。

したがって、特定の質問は次のとおりです。上記のコードの何が正確に間違っているのか、修正できるかどうかを知っている人はいますか?

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

scala - Playframework のセッションはどのようにアクションに注入されますか?

独自のアクションを記述して、DatabaseSession を暗黙的に渡そうとしています。ただし、せいぜいコントローラーでこのようなことを行うことができます。

playframework では、次のようにセッションにアクセスできます。

ここでわかるように、リクエストのみが暗黙的に渡された場合、セッションに直接アクセスできます。では、セッションはどこから来るのでしょうか。また、Session と同じように DatabaseSession を渡すにはどうすればよいでしょうか? 私が書く必要がないように:

slick は dbSession を暗黙的に渡すことができるため、これが可能であることはわかっています。しかし、私は彼らがそれをどのように行うかを理解できないようです.

https://github.com/playframework/play-slick/blob/master/code/src/main/scala/play/api/db/slick/DBAction.scala

完全に混乱しています!=S