2012-05-11 11 views
7

私はScalaを今深く読んでいます。この本からの抜粋は次のとおりです。パスに依存するタイプの投影法はありますか?

すべてのパスに依存する型は型投影です。 foo.Barは、コンパイラによってfoo.type#Barとして と書き直されます。

すべての型参照は、名前付きエンティティに対するプロジェクトとして記述することができます。 scala.Stringはscala.type#Stringの略語であり、scalaという名前はパッケージscalaを指し、Stringの型はscalaパッケージのStringクラスで定義されています。

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

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

私の質問は次のとおりです。パスに依存する型は投影法ですか?それはちょうど内部のコンパイラ表現か、またはスカラコードで表現することができますか?

答えて

8

はここ

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

scala> val foo = new Foo 
foo: Foo = [email protected] 

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

、ジョシュが書いたものを確認し、迅速REPLセッションですあなたscala.type#Null例の問題点は、接頭辞scalaではなく価値の安定的な識別子であるよりも、パッケージの接頭辞であるということです。おそらくそれは後者であるはずですが、残念ながらそれはそうではありません。それはScalaパッケージの意味とScalaオブジェクトの意味(モジュールという意味で)が長引くことです。

+0

しかし、SLS§3.1によると、パスは以下のうちの一つです... p.xここで、pはパス、xはpの安定メンバーです。安定したメンバは パッケージです...安定した識別子は識別子で終わるパスです。 '' scala.Null'は安定した識別子です。右? – 4e6

+0

いいえ、すべての安定した識別子は値またはパッケージです: 'scala.Null'はタイプではなく値を指定します。 'scala'は安定した識別子ですが、あなたが観察したように、オブジェクトではなくパッケージであるため、演算子' .type'でのシングルトン型の振る舞いは、私が答えた 'foo'の例とは異なります。 –

+0

ああ、今、私はそれが '.type'の振る舞いのすべてだと思っています。それを理解するのに時間がかかりました。ありがとうございます:) – 4e6

関連する問題