8

私は今Scalaを深く読んでいます。本からの抜粋は次のとおりです。

すべてのパス依存型は型射影です。パス依存の型は、コンパイラによってfoo.Bar書き換えられます...foo.type#Bar

Scala では、すべての型参照は、名前付きエンティティに対するプロジェクトとして記述できます。タイプ scala.String はscala.type#String、名前scalaがパッケージを参照する場所の省略形でscalaあり、タイプはscala パッケージのクラスStringによって定義されます。String

明らかに、scala.Stringクラスはありませんが、これを で再現できませんでしたNull

scala> type N = scala.type#Null
<console>:7: error: type mismatch;
 found   : type
 required: AnyRef
       type N = scala.type#Null

それで、私の質問は次のとおりです。パス依存型は射影型ですか? 内部コンパイラ表現だけですか、それともscalaコードで表現できますか?

4

1 に答える 1

10

Josh が書いたことを確認する簡単な REPL セッションがあります。

scala> class Foo { type T = String }
defined class Foo

scala> val foo = new Foo
foo: Foo = Foo@10babe8

scala> implicitly[foo.type#T =:= foo.T]
res0: =:=[foo.T,foo.T] = <function1>

scala.type#Nullあなたの例の問題は、プレフィックスscalaが値の安定した識別子ではなくパッケージプレフィックスであることです。おそらく後者であるべきですが、残念ながらそうではありません... これは、Scala パッケージのセマンティクスと Scala オブジェクト (モジュールの意味で) の間の長引く不一致です。

于 2012-05-11T18:22:27.597 に答える