問題タブ [context-bound]
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でマージソートを実装しようとしました。私は次のようになりました:
この質問は、非効率なリバースが行われていることや、末尾再帰の欠如に関するものではありません。むしろ、次のように並べ替えアルゴリズムを渡すことでマージソートを一般化できることに気付きました。
次に、マージソートを次のように再実装しようとしました
しかし、これはコンパイルに失敗し、適切なものが見つかりませんOrdering[A]
:
物事を範囲内に収めるための弱い試みとして、私が試した
しかし、役に立たない。
問題は の 2 番目のパラメーターにあると思われますgeneralizedMergesort
。パラメータは a だと言いますが、 aList[A] => List[A]
を渡しますが、それを利用してと 自体の観点からList[A] => implicit Ordering[A] => List[A]
実装するという目標を達成する方法がわかりません。mergesort
generalizedMergesort
scala - 複数の型クラスの関係を持つあいまいな変換チェーンを回避するにはどうすればよいですか?
私のライブラリには、次の 3 つの型クラスがあります。
これらの型クラスは、次の条件下で相互に変換できます。
- type
T
がscala.math.Numeric
型の場合、それはAbelianGroup
. - type
T
が の場合AbelianGroup
、それもMonoid
(現在AbelianGroup
extendsMonoid
ですが、必ずしもそうである必要はありません) - type
T
が型 U の Vector であり、型 U が aMonoid
である場合、型T
も aMonoid
です。 - 型 T が型 U の Vector であり、型 U が である
AbelianGroup
場合、T
もAbelianGroup
です。
たとえば、(Int, Int)
は type 上の Vector でInt
ありInt
、AbelianGroup であるため、(Int, Int)
も AbelianGroup です。
これらの関係やその他の関係は、次のようにコンパニオン クラスで簡単に実装できます。
(Int, Int)
これは、タプル型のようなものをモノイドとして使用しようとするまではうまくいきます。コンパイラは、そのような型の Monoid 型クラス オブジェクトを取得する 2 つの方法を見つけます。
Monoid.fromAbelianGroup(AbelianGroup.fromVector(Vector.from2Tuple, AbelianGroup.fromNumeric))
Monoid.fromVector(Vector.from2Tuple, Monid.fromAbelianGroup(AbelianGroup.fromNumeric))
このあいまいさを解決するために、Monoid のコンパニオン クラスを修正して Numeric (および に直接変換できる他の型AbelianGroup
) からの直接変換を含めました。
ただし、これは基本的に DRY の原則に違反しているため、少し満足のいくものではありません。s の新しい実装を追加するときは、と OtherTypeX などでAbelianGroup
行ったのと同じように、両方のコンパニオン オブジェクトに変換を実装する必要があります。Numeric
この冗長性を回避し、コンパイル時のあいまいさエラーを解決するためにコードを修正する方法はありますか? この種のシナリオでのベスト プラクティスは何ですか?
scala - ケースクラスとコンパニオンの異なる順序の暗黙的な解決
通常、最初に a を書きcase class
、次にコンパニオンobject
を同じファイルのすぐ下に書きます。しかし、コンパニオンで宣言されたものをインポートしようとすると、implicit
宣言の順序を切り替える必要があります (もちろん、そうしたくありません)。この状況を克服するために推奨される方法は何ですか?
具体的なケースでは、次のコードは機能しません。
object FooWorker
しかし、それが機能する前に宣言するcase class FooWorker
と。テストには Scala 2.11.6 と SBT を使用しています。どうもありがとう!
scala - コンテキストがバインドされたケース クラスにマクロ アノテーションを適用するにはどうすればよいですか?
ケース クラスにマクロ アノテーションを追加しようとすると、次のようになります。
エラーが発生します:
@macid
は、ホワイトボックス StaticAnnotation として定義された単なる恒等関数です。
注釈なしのコードは次のように機能します。
バインドされたコンテキストを削除すると機能します。
何が起こっているかというと、バインドされたコンテキストが非公開パラメーターに脱糖されているということです。次の脱糖コードでも同じエラーが発生します。
動作するコードを取得するために、暗黙のパラメーターを次のように公開しval
ます。
私の質問は次のとおりです。マクロ注釈がコンテキスト境界をサポートする正しい方法は何ですか? コンパイラが、マクロ アノテーションによって生成されたコードに対して非公開パラメーターのケース クラスのチェックを実行するのに、通常のコードのチェックを実行しないのはなぜですか?
Scala バージョン 2.11.7 と 2.12.0-M3 の両方でエラーが報告されます。上記のコード例はすべて、2.11.3 で期待どおりにコンパイルおよび実行されます。
scala - Play アクション コンポジション - パラメータ化されたパーサーのハードコーディング
次のようなアクションを書く定型文を取り除くカスタム アクションを作成したいと思います。
ただし、クラス定義エラーが発生し続けます。これが私の最も成功した試みです:
しかし、次のエラーが表示されます。method composeAction overrides nothing.
変更composeAction[A: Reads]
するcomposeAction[A]
と、タイプ A の Json シリアライザーがないことがわかります。
このカスタム アクションを定義する他の方法はありますか?
scala - トレイトにバインドされた scala コンテキストを定義するための省略形
scala 抽象クラスでは、コンテキスト バウンドを定義したい場合、たとえば [T: ClassTag] をパラメーターで使用できますが、これはトレイトでは不可能です。
次のように定義した場合:
Bar 内で ctg を読み取ろうとすると、暗黙的なパラメーターが末尾再帰になるため、StackOverflowError がトリガーされます。
では、サブクラスをコンテキスト バインドに自動的に公開するトレイトで ctg を定義できるようにする最善の方法は何でしょうか?
scala - Scala の isInstanceOf[T] 関数が境界付き ClassTag/TypeTag を使用できない
次のコード:
コンパイルで次の結果が得られます。
奇妙なことに、大文字と小文字の一致は意図したとおりに機能します。isInstanceOf[T] に ClassTag コンテキストのバインドも認識させる方法はありますか?
scala - 上限とコンテキスト バウンドを同時に使用しようとすると ScalaC 例外が発生する
上限とコンテキスト バウンドを同時に使用しようとすると、scalac 例外が発生します。許可されていますか?私はScala 2.11.8を使用しています
このことを考慮
コンパイル時に私が得る
何が欠けていますか?
更新: 私には魔法のように見えますが、フィールドの位置を変更するとエラーはなくなりますmessage: T
。1 番目または 2 番目の位置にある場合はコンパイルされます。誰でも理由を説明できますか?
scala - Scala: トリプル コンテキスト境界、証拠パラメーターが見つかりません
これを編集して、@Zhi Yuan Wang が回答した質問のより単純な形式にしました。
次のエラーが表示されます。
REPLで次を取得しているにもかかわらず:
Zhiのawserは正しいです。以下がコンパイルされます。
ただし、これらは2つの異なるメソッドのパラメーターであり、メソッドは通常パラメーター名を再利用できるため、これはまだ正しい動作とは言えません。
scala - Scala - サブコンテキスト バインド メソッドを使用して trait メソッドをオーバーライドする
為に
これはビルドしません。エラー:
エラー:(15, 7) タイプ [U <: users.User](u: U)Boolean の特性 AuthUserObject でメソッド authorize をオーバーライドしています。メソッド authorize には互換性のない型があります def authorize[T <: Trader](t: T): Boolean ^
トレーダーのみが税金を支払うため、ユーザーに限定AuthTraderObject
する必要があります。Trader
このオーバーライドはどのように可能ですか?