問題タブ [implicit-parameters]
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 - 他のファイルの同じスコープの暗黙的なパラメーター
http://docs.scala-lang.org/tutorials/FAQ/finding-implicits.htmlで暗黙のパラメーター (および変換) の優先順位規則を確認すると、次の優先順位リストが見つかりました。
- 現在のスコープでの最初のルック
- 現在のスコープで定義されている暗黙
- 明示的なインポート
- ワイルドカードのインポート
他のファイルの同じスコープ- ...
他のファイルの同じ範囲が取り消し線で囲まれているのはなぜだろうか。機能の実装は保留中ですか? 何らかの理由で削除されましたか?私のこれまでの経験では、この機能は利用できないことを示していますが、なぜリストされているのか知りたいです。
scala - Scala - 抽象型と暗黙的なパラメーター解決
Scala 2.10.4 を使用しています。
類推をむき出しにしてください - 実際のコードは複雑なプログラムに深く埋め込まれているので、それを説明するのではなく、時間をかけて動物について話すために問題を抽象化します ;-)
scala には 2 つの特徴があります。たとえば、次のとおりです。
Animal、およびHouseBase。
Animal を変更することはできませんが、Dog、Rabbit、Fish などのクラスを継承しています。面倒なことに、使用するすべてのサブクラスを所有しているわけではないため、すべてのサブクラスを変更することはできません。
私の動物はすべてどこかに住んでいます。彼らの家は HouseBase から継承する必要があります。HouseBase とそのサブクラスを変更できます (必要に応じて、別の抽象化レイヤーを介して)。
したがって、Dog は Animal のサブクラスであり、HouseBase のサブクラスである Kennel に住んでいます。
うさぎは小屋に、魚は水槽に住む。
ここでは 1 対 1 の関係が強制されていないことに注意してください。魚は池にも住むことができ、それも処理できる必要があります。
私が望んでいたのは、抽象型 Animal を介して参照される具体的な動物 (Fish など) が与えられ、具体的な戻り値の型 (Tank など) が与えられた場合、Scala は正しい暗黙のパラメーターを自動的に選択できるということでした。私が下に持っているデザイン。
ただし、2 つの関連する問題があります。
問題 1 - 動物が抽象として参照されている場合、暗黙的なパラメーターは、基になる具象型ではなく抽象型 (動物) を取る関数のみを検索します。Scala は実行時間情報を使用していないように見えるので、解決策は ClassTags を使用することではないでしょうか? 私はこれを実装しようとしましたが、どうしようもなく迷ってしまいました (私は Scala にかなり慣れていません!)。
問題 2 - 私の動物が複数の種類の家に住むことができる場合、同様の問題が発生します。具体的な戻り値の型が指定されていても、コンパイラは Fish の 2 つの暗黙的なオブジェクトがあいまいであると判断します。私はここで何をすべきかについて少し困惑しています!
実行時に型に一致するように手動のボイラープレートを使用してソリューションを考え出すことはできますが、これはあまり拡張可能ではありません。
どんなアイデアもありがたく受け取った!コードの残りの部分は以下のとおりです。
編集 - これらのリンクは、私が疑っていたことを裏付けているようです。そのコンパイル時のポリモーフィズムが使用されているため、実行時の型を知ることができません。
http://like-a-boss.net/2013/03/29/polymorphism-and-typeclasses-in-scala.html
それで、私の質問は、これを考えると、ランタイムディスパッチを使用するように私の例を変更する方法があると思いますか?
動物:
ハウスとインプリシット:
scala - 暗黙のパラメーターとジェネリック型
この状況でのコンパイラの動作を理解しようとしています
上記のコードはコンパイルされず、次のエラーが発生します。
あいまいな暗黙の値: 型 [A] のオブジェクト Predef のメソッド $conforms ⇒ <:<[A,A] と、型 ⇒ String ⇒ Int のオブジェクト ImplicitTest の値 bar の両方が期待される型 String ⇒ T に一致します。
エラーは、暗黙の値が Predef で定義された別の暗黙の値と競合していることを示しているため、これに基づいて、既知の型から未知の (ジェネリック) 型に値を変換する関数に暗黙のパラメーターを宣言する方法がないようです。
これは、コンパイラの技術的な制限によるものですか、それとも動作するはずの方法であり、私が認識していないいくつかの制約に違反していますか?
scala - 暗黙のパラメータを必要とするScalaで名前でクラスをインスタンス化する方法は?
次のように宣言されたクラスがあります。
関数では、クラスの名前 (ここでは className) を使用してクラスをインスタンス化しています。
私はこのようにそれをやろうとしました:
asSubclass classOf[エンリッチャー]
ただし、これはコンストラクターが引数を必要としない場合にのみ機能します。
どうすればいいですか?