このブログには次のコードが表示されます。 Scalaのタイプレベルプログラミング :
// 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]
}
コード#
には演算子R#X[R#Next]
がありますが、これは私が見たことがありません。それを検索するのは難しいので(検索エンジンによって無視されます)、誰が私にそれが何を意味するかを伝えることができますか?
それを説明するには、まずScalaでネストされたクラスを説明する必要があります。この簡単な例を考えてみましょう。
class A {
class B
def f(b: B) = println("Got my B!")
}
それでは、何か試してみましょう。
scala> val a1 = new A
a1: A = A@2fa8ecf4
scala> val a2 = new A
a2: A = A@4bed4c8
scala> a2.f(new a1.B)
<console>:11: error: type mismatch;
found : a1.B
required: a2.B
a2.f(new a1.B)
^
Scalaの別のクラス内でクラスを宣言するとき、そのクラスの各インスタンスにはそのようなサブクラスがあると言っています。言い換えると、A.B
クラスはありませんが、a1.B
クラスとa2.B
クラスがあり、それらは異なるクラスです。 。
それを理解していない場合は、パス依存型を検索してください。
現在、#
を使用すると、特定のインスタンスに制限することなく、このようなネストされたクラスを参照できます。つまり、A.B
はありませんが、A#B
はあります。つまり、B
のネストされたクラスanyA
のインスタンスです。
上記のコードを変更することで、これを実際に見ることができます。
class A {
class B
def f(b: B) = println("Got my B!")
def g(b: A#B) = println("Got a B.")
}
そしてそれを試してみてください:
scala> val a1 = new A
a1: A = A@1497b7b1
scala> val a2 = new A
a2: A = A@2607c28c
scala> a2.f(new a1.B)
<console>:11: error: type mismatch;
found : a1.B
required: a2.B
a2.f(new a1.B)
^
scala> a2.g(new a1.B)
Got a B.
型射影として知られ、型メンバーへのアクセスに使用されます。
scala> trait R {
| type A = Int
| }
defined trait R
scala> val x = null.asInstanceOf[R#A]
x: Int = 0
基本的に、これは他のクラス内のクラスを参照する方法です。
http://jim-mcbeath.blogspot.com/2008/09/scala-syntax-primer.html (「pound」を検索)
「シンボリック演算子」(実際にはメソッドです)を検索するためのリソースがありますが、scalexで検索するために「#」をエスケープする方法がわかりません)