0

この投稿で尋ねられた質問に対する回答を理解しようとしています。

以下のコードは、受け入れられた回答で提案されたソリューションを再現しています。

object Finder {
  def find[T <: Node](name: String)(implicit e: T DefaultsTo Node): T = 
    doFind(name).asInstanceOf[T]
}    

sealed class DefaultsTo[A, B]
trait LowPriorityDefaultsTo {
  implicit def overrideDefault[A,B] = new DefaultsTo[A,B]
}
object DefaultsTo extends LowPriorityDefaultsTo {
   implicit def default[B] = new DefaultsTo[B, B]
}

暗黙的が次のように定義されている場合、私はそれを理解します

(implicit e:  DefaultsTo[T, Node])

しかし、代わりに、中置表記のように見えるもので定義されています。DefaultsTo[T, Node]型が のように書けるとは知りませんでしたT DefaultsTo Node。これは何が起こっているのですか?

4

1 に答える 1

2

しかし、代わりに、中置表記のように見えるもので定義されています。タイプ DefaultsTo[T,Node] が「T DefaultsTo Node」と記述できることを知りませんでした。これは何が起こっているのですか?

はい。ルールは非常に単純です。型には正確に 2 つのパラメーターが必要です。主に のような記号名を持つ型を対象として<:<いますが、ご覧のとおり、英数字の名前でも機能します。

Scala 仕様、3.2.8 インフィックス タイプ:

InfixType     ::=  CompoundType {id [nl] CompoundType}

中置型は、2 つの型オペランドおよびに適用されるT1 op T2中置演算子で構成されます。この型は application 型と同等です。中置演算子は、任意の識別子にすることができます。opT1T2op[T1,T2]op

すべての型中置演算子の優先順位は同じです。グループ化には括弧を使用する必要があります。型演算子の結合性は項演算子と同様に決定されます。コロン ':' で終わる型演算子は右結合です。他のすべての演算子は左結合です。

連続する型中置演算のシーケンスではt0 op t1 op2 … opn tn、すべての演算子op1,…,opnが同じ結合性を持つ必要があります。それらがすべて左結合の場合、シーケンスは と解釈され(…(t0 op1 t1) op2…) opn tn、それ以外の場合は と解釈されt0 op1 (t1 op2 (…opn tn)…)ます。

于 2015-08-24T08:52:26.367 に答える