4

次のコードを理解しようとしています。しかし、R#X の意味がわかりません。誰かが私を助けることができますか?

 // define the abstract types and bounds
 trait Recurse {
    type Next <: Recurse
// this is the recursive function definition
    type X[R <: Recurse] <: Int
 }
// implementation
 trait RecurseA extends Recurse {
    type Next = RecurseA
  // this is the implementation
    type X[R <: Recurse] = R#X[R#Next]
 }
object Recurse {
  // infinite loop
  type C = RecurseA#X[RecurseA]
}
4

1 に答える 1

6

クラスの既存のインスタンスから型を取得できます。

class C {
  type someType = Int
}
val c = new C
type t = c.someType

または、オブジェクトをインスタンス化せずに型に直接アドレス指定することもできます。C#someTypeこの形式は、中間変数を作成するスペースがない型式に非常に役立ちます。


コメントで提案されたように、いくつかの説明を追加します。

免責事項: Scala の型システムがどのように機能するかについて、私は部分的にしか理解していません。ドキュメントを何度か読もうとしましたが、断片的な知識しか抽出できませんでした。しかし、私は scala で豊富な経験を持っており、個々のケースでのコンパイラの動作をうまく予測できます。

#型プロジェクションと呼ばれる型プロジェクションは、.すべての型式で scala が暗黙的に両方を使用することで、通常の階層型アクセスを補完します。

scala リファレンスは、そのような目に見えない変換の例を示しています。

t                        ə.type#t
Int                      scala.type#Int
scala.Int                scala.type#Int
data.maintable.Node      data.maintable.type#Node

.typeご覧のとおり、型射影の些細な使用法はすべて、実際にはオブジェクトではなく型 (つまり return with ) で機能します。主な実際の違い (私は定義が苦手です) は、オブジェクト型はオブジェクト自体と同様に一時的なものであるということです。その型は、抽象クラス型の継承などの適切な状況で変更される場合があります。対照的に、型の型 (型射影の定義) は太陽と同じくらい安定しています。scala の型 (クラスと混合しないでください) はファーストクラスの市民ではなく、それ以上オーバーライドすることはできません。

型式を配置するのに適したさまざまな場所があります。また、安定型のみが許可されている場所もあります。したがって、基本的に型射影は、型の用語に対してより一定です。

于 2013-07-29T03:06:53.890 に答える