web-dev-qa-db-ja.com

Scalaでの `#`演算子の意味は何ですか?

このブログには次のコードが表示されます。 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]がありますが、これは私が見たことがありません。それを検索するのは難しいので(検索エンジンによって無視されます)、誰が私にそれが何を意味するかを伝えることができますか?

120
Freewind

それを説明するには、まず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.
227

型射影として知られ、型メンバーへのアクセスに使用されます。

scala> trait R {
     |   type A = Int
     | }
defined trait R

scala> val x = null.asInstanceOf[R#A]
x: Int = 0
11
missingfaktor

基本的に、これは他のクラス内のクラスを参照する方法です。

http://jim-mcbeath.blogspot.com/2008/09/scala-syntax-primer.html (「pound」を検索)

7
moveaway00

「シンボリック演算子」(実際にはメソッドです)を検索するためのリソースがありますが、scalexで検索するために「#」をエスケープする方法がわかりません)

http://www.artima.com/pins1ed/book-index.html#indexanchor

2
Gene T