問題タブ [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 型推論を機能させる際の問題
一般的な目標:
たとえば、非常にプラグ可能な課題トラッカーを開発したいとします。そのコア実装は、チケット ID と説明のみをサポートする場合があります。他の拡張機能は、他のさまざまなフィールドのサポートを追加する可能性がありますが、それらのフィールドは同じテーブルのデータベースに存在する可能性があります。そうでない場合でも、データベースへのクエリの数は、拡張機能の数とともに増加する必要はありません。クエリの定義に貢献できる必要があります。
Item[A, B, R[_]]
はA
、テーブル型 (列表現を持つ) をB
データ型R
として、型コンストラクターとして type の列を表す列を表しますB
。たとえば、R[B]
ScalaQuery の もそうかもしれません。NamedColumn[String]
現在、「クエリ」の構築を処理する型クラスを作成しようとしています。
問題:
(最後にある) val q で始まる行は、単純val q = query(items)
に読み取ってコンパイルする必要があります。さまざまな試みにより、defaultNext
推論B0
された型引数が期待される型引数に準拠していないというエラーが発生します。ただし、暗黙的なエラーは、間違った型推論によって引き起こされると思います。B
Nothing
私はすでにこれにかなりの日数を費やしてきました (これは私のオープンソース プロジェクトのためです)。
scala - Scalaでの暗黙のリフティング
A => B
関数をからに暗黙的に変換したいList[A] => List[B]
。
私は次の暗黙の定義を書きました:
残念ながら、私が次のコードを書くとき、暗黙は適用されません:
関数に明示的な時間で注釈を付けると、正常に機能します。
なんで?どうすれば修正できますか?
アップデート。問題は無名関数に固有のようです。比較:
最初のものはうまくコンパイルされています。2番目のものはエラーとしてマークされます
scala - 暗黙的な変換を安全に連鎖させる
これを行うと、チェーンへの暗黙的な変換を取得できます。
しかし、これは明らかに安全ではありません。
ただし、このバージョンに問題はありません。
ここに落とし穴はありますか?
scala - 些細な暗黙的なものが見つからないのはなぜですか?
次のような些細なことでも、なぜ暗黙的なものが見つからないのですか?
num
手動で渡さなければコンパイルされませんdata.sum
scala - Scala-暗黙のパラメーター選択に適用されるCo/Contra-Variance
私はこのような特徴を持っています:
このように動作する関数を使用すると、次のようになります。
意図は次のようなことをすることです:
つまり、これは、環境がすでに折り畳み方法を知っている型の型クラスであり、Int、Stringsなどに対して定義できます。
私の問題は、次のように、優先されるより具体的な暗黙情報も必要なことです。
ただし、あいまいさがあるため、そのメソッド呼び出しは競合を生成します。
ですから、私が欲しいのは、コンパイラーがAnyと私の型の間で最も具体的な暗黙を検索することです。目的は、醜いシャドウイングなしで、より具体的なサブタイプに対して簡単にオーバーライドできる基本タイプのデフォルト実装を提供することです。
私はここで願わくば考えているかもしれませんが、希望することしかできません:-)
scala - 周囲のスコープからの暗黙的なパラメーター解決
私は自分のコードに暗黙的なパラメーターを持ち込むのが好きではないので、それらを使用する場所でそれらの使用をカプセル化したいと考えています。そのため、spray-json への呼び出しを例外処理でラップし、モデル クラスごとにデフォルトの暗黙的な JsonFormats を含むオブジェクトを定義しようとしています。ただし、暗黙的なパラメーターは、コードを呼び出すクライアントにインポートされない限り解決されません。これは、まさに私が望んでいない場所です。これが私がこれまでに持っているものです(暗黙のフォーマッタを解決しません)。私がやりたいことを得る方法はありますか?
注意。JsonFormat は JsonReader の型です
編集:@paradigmaticの2番目の提案に基づいて私が書いたものは次のとおりです(これは機能しませんが、まだ取得できませんCannot find JsonReader or JsonFormat type class for T
)。何か不足していますか?
記録として、これは機能するコード スニペットですが、あまりにも多くのクライアント コードを必要とするため (つまり、スコープ内に暗黙的なコードを含める必要があるため)、回避しようとしています。
scala - Scalaの暗黙的なパラメーターに相当するGroovy
次のようなものを表現するためのGroovyの代替手段はありますか?
更新:ここでフォローアップの質問を参照してください:Scalaの暗黙的なパラメーターに相当するGroovy-拡張
scala - Scala の暗黙的なパラメーターに相当する Groovy - 拡張
この質問は、Scala の暗黙的なパラメーターに相当する以前の Groovyの質問を拡張します。
これが前のトピックから発展させる正しい方法であるかどうかはわかりませんが、とにかく..
次のようなグルーヴィーなものを表現する方法を探しています。
一般に、ロジックの一部を実行し、その中の変数を実行の「コンテキスト」に基づいて解決したいと考えています。Scala の暗黙的要素を使用すると、このシナリオを制御できるようです。Groovyで同様のことを行う方法を見つけようとしています。
最初の質問からのフィードバックに基づいて、次のようにアプローチしようとしました。
ここで、http: //groovy.codehaus.org/Closures+-+Formal+Definitionで groovy クロージャーの定義を調べました。
私が理解しているように、ゲッターが呼び出されると、「コンパイラーは「値」が利用可能であることを静的に判断できない」ため、失敗が発生します
では、このシナリオに関する提案はありますか? 乾杯
scala - Scala ビュー アプリケーション パズル
次の 2 つの特性があるとします。
そして、2 番目から 1 番目への暗黙的な変換:
Bar
と整数のリストを作成します。
今、私は次のように動作することを期待しています:
しかし、そうではありません:
そこで、specに移動します。これには次のように書かれています (太字の強調は私のものです)。
ビューは 3 つの状況で適用されます。
【ここは関係ない】
タイプTのeを持つ選択emで、セレクターmがTのメンバーを示さない場合。この場合、eに適用可能で、その結果にmという名前のメンバーが含まれるビューvが検索されます。検索は、暗黙のパラメーターの場合と同様に進行します。ここで、暗黙のスコープはTのスコープです。そのようなビューが見つかった場合、選択emはv(e).mに変換されます。
タイプTのeを持つ選択em(args)で、セレクターmがTの一部のメンバーを示しているが、これらのメンバーのいずれも引数argsに適用できない場合。この場合、eに適用可能なビューvが検索され、その結果にはargs に適用可能なメソッドmが含まれます。検索は、暗黙のパラメーターの場合と同様に進行します。ここで、暗黙のスコープはTのスコープです。そのようなビューが見つかった場合、選択emはv(e).m(args)に変換され ます。
そこで、私たちは次のことを試みます。
ただし、(少なくとも 2.9.2 と 2.10.0-RC2 の両方で):
これは、この問題の回避策の例のように、いくつかの非常に奇妙な動作につながります。
3 つの (密接に関連する) 質問があります。
- 上記の元のケースでビューを正しく適用する簡単な方法 (つまり、適切な名前で偽のメソッドを追加する必要がない方法) はありますか?
- 誰かがこの動作を説明する仕様の読みを提供できますか?
- これが意図された動作であると仮定すると、まったく意味がありますか?
また、この問題に関する以前の議論へのリンクもあれば幸いです。Google とのやり取りはあまりうまくいきませんでした。
scala - Scalaで再帰的な方法で暗黙の変換を適用できるようにする方法
いくつかのscalaタイプをHTML表現に変換するための変換ライブラリを作成しようとしています。List(1,2).toHtml
たとえば、を実行して取得<ul><li>1</li><li>2</li></ul>
したいと思いString
ます。
これまで、結果タイプの検出と正しいの適用にうまく機能する一連の暗黙的な変換を作成しましたtoHtml
。
サンプルを見せてみましょう:
このコードを使用すると、コンパイラーに問い合わせるたびList(1,2).toHtml
に、正しい変換が得られます。他のIterable
valの場合と同じように。
ここでの私の問題と質問は、このtoHtml変換を再帰的に使用するにはどうすればよいですか?を入力した場合List( List(1,2), List(3,4) ).toHtml
、取得したいので<ul> <li><ul><li>1</li><li>2</li></ul></li> <li><ul><li>3</li><li>4</li></ul></li> </ul>
、toHtml
変換は入力のすべての要素に再帰的に適用されますIterable
。
コンパイラが完全に理にかなっていると教えてくれたので、うまくいかなかったtoHtml
定義を変更しようとしました。
私の問題はおそらく暗黙の定義から戻ってきていることにあることを知っています。それはおそらく特性か何かを持つクラスを返すはずです。
暗黙について多くのことを読んでみましたが、fromIterableシグネチャのパラメータを解除したり、そのようないくつかの特定のケースを定義したりせずに、この変換を再帰的に適用できることをまだ理解していません... def toHtml = <ul> { l.map{ e => <li>{ e.toHtml }</li> } } </ul> toString
value toHtml is not a member of type parameter A
new Object { ... }
fromIterable[A]
toHtml
fromIterable(l : List[List[Any]])
それを達成する方法と私が間違っていることについていくつかアドバイスをください。
ありがとう!