問題タブ [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.
scala - モナドを使用した Scala の暗黙的な自然変換は、理解のための関数を見つけることができません
私が持っているコードはこれです:
そして intellij は暗黙を認識し、コンパイル時に map 関数を解決できません。ここで明らかに間違っていることはありますか?
scala - scala コンパイラは暗黙のクラスを最適化するために何かをしますか?
次のような暗黙のクラスがあるとします。
メソッド sayHello を String クラスで定義されているかのように使用できます。
scala コンパイラーはこれを静的呼び出しのようなものに最適化して、RichString オブジェクトを構築するオーバーヘッドを回避しますか?
scala - 暗黙の監視を伴う型レベル関数の構成
かなり複雑な型レベルの計算をいくつか試しています。そこには、いくつかの型タグ ( 、A
、B
、および などC
) と、それらに作用する関数があります。これらは、パス依存の結果型を持つ暗黙の監視によって表されます。
計算の過程で、「実装」するときComposed
、上記のコードが与えられた場合、原則として変換できるという事実を利用する必要がありますA
(C
この例では、構成が必要なだけですが、実際にはもっと多くのことが関係しています) .
しかし、私は常に Implicit が推移的に適用されないという制限によって制限されているため、構成を表現する方法がわかりません。次のコードは、「暗黙的に見つかりません」で失敗します。
私が実際に最初に書こうとしたのは次のとおりです。
f1OfLast
定義されている同じパラメーターリストで使用したため、これはもちろん失敗しました。暗黙のパラメーターでない場合は、次のように記述できます
ただし、2 つの暗黙的なパラメーター リストを使用してこれを行うことはできません。これは、言語で許可されていないためです。
F2[F1[X]]
要するに、上記の例で証人を得るにはどうすればよいですか? 必要に応じて、型レベル関数の書き方を変更することもできますが、それらを表現する別の方法はまだ見つかっていません。
scala - Shapeless select[U] による無限再帰
私には、Scala で暗黙的な依存性注入をより簡単にするための素晴らしいアイデアがありました (まあ、それには議論の余地がありますが、私にアイデアがあったとしましょう)。私が抱えている問題は、暗黙的な依存関係を必要とするメソッドを呼び出す場合、その具体的な依存関係が最終的にスコープに入るまで、呼び出し元のメソッドを同じ依存関係で装飾する必要があることです。私の目標は、具象クラスに混在するときに暗黙のグループを必要とする特性をエンコードできるようにすることでした。これにより、暗黙を必要とするメソッドを呼び出すことができますが、その定義は実装者に委ねられます。
これを行う明白な方法は、この疑似スカラのようなある種の自己型を使用することです:
その優れた構文を得るために実際に atrait and[A,B]
を実装しようと勇敢に何度か試みた後、私は shapeless から始めて、それでどこにでも行けるかどうかを確認する方が賢明だと思いました。私はこのようなものに着陸しました:
これが実際にコンパイルされたとき、私はかなり興奮していたと言わざるを得ません。しかし、実際に をインスタンス化すると、 と の間でMyImpl
無限の相互再帰が発生することがわかります。MyImpl.provide
Required.provide
shapeless で犯した間違いが原因だと思う理由は、ステップスルーすると、それに到達してselect[T]
から HListOps にステップインし (HListOps にはselect[T]
メソッドがあるため、理にかなっています)、その後跳ね返るように見えるからです。への別の呼び出しにRequires.provide
。
私の最初の考えは、それを明示的に保護していないため、からSelector[L,T]
暗黙的に取得しようとしているということでした。しかし、provide
provide
- コンパイラは、 を取得するつもりはないことを認識し、
Selector
別provide
の候補を選択するか、コンパイルに失敗する必要がありました。 provide
暗黙的に受け取ることを要求してガードすると (この場合、を取得するSelector[L,T]
だけで済みます)、 が原因でコンパイルされなくなります。これは、アドレス指定の方法がよくわかりません。apply
Selector
T
diverging implicit expansion for type shapeless.ops.hlist.Selector[Int :: String :: HNil]
私の考えがそもそも間違っている可能性があるという事実は別として、人々が通常、この種の神秘的で核心を突いたものをどのようにデバッグしているのか知りたいです。ポインタはありますか?
scala - 暗黙のマクロ解決
マクロによって生成される暗黙のパラメーターを取得しようとしています。StructTypeInfo 暗黙を要求すると、コンパイラ エラーが発生し、log-implicits が次のように表示されます。
コンパイルする方法は、パラメーター化されたクラスでラップする場合です。
ここに関連するコードがいくつかあります(何かを省略した場合はお知らせください):
興味深いことにmaterializeCaseClassSchemaType[MyCaseClass]
、暗黙的なスポットで関数に明示的に渡すと、正常に動作します。なぜラッパーが必要なのですか? それを取り除くことはできますか?
scala - 私の範囲内の暗黙の変換が「暗黙の証拠」として受け入れられない理由が不明
私は暗黙の変換を実験してきましたが、これらを使用する「enrich-my-libray」パターンについて十分に理解しています。基本的な暗黙の理解と暗黙の証拠の使用を組み合わせようとしました...しかし、以下の方法で示すように、私は何か重要なことを誤解しています:
上記の方法を実行すると、次のエラーが発生します。
私のスコープ内の暗黙的な変換は、Int を FooInt に、またはその逆に変換できるという十分な「証拠」になると思っていたので、私は困惑しています。これについて私をまっすぐに設定してくれてありがとう!
アップデート:
以下のピーターの優れた答えに混乱しなかった後、APIで暗黙の証拠を使用したいという正当な理由の1つに電球がつきました。この質問に対する私自身の回答で詳しく説明します(以下も)。
scala - scala.js サンプル アプリでの「暗黙の ExecutionContext が見つかりません」というエラー。
以下は、Hands-on Scala.js ebook の例です。
コンパイル時にエラーが発生しました:
ここで何がうまくいかなかったのですか?