`#`运算符在Scala中意味着什么?

时间:2012-02-25 09:57:16

标签: scala type-systems

我在此博客中看到了此代码:Type-Level Programming in 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]。由于难以搜索(被搜索引擎忽略),谁能告诉我它是什么意思?

4 个答案:

答案 0 :(得分:216)

为了解释它,我们首先要解释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.Ba2.B类,它们是不同的类,因为上面的错误消息告诉我们

如果您不明白,请查找路径相关类型。

现在,#使您可以引用此类嵌套类,而不会将其限制为特定实例。换句话说,没有A.B,但有A#B,这意味着B 任何 A实例的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.

尝试一下:

{{1}}

答案 1 :(得分:11)

它被称为类型投影,用于访问类型成员。

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

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

答案 2 :(得分:7)

基本上,它是一种引用其他类中的类的方法。

http://jim-mcbeath.blogspot.com/2008/09/scala-syntax-primer.html(搜索“pound”)

答案 3 :(得分:2)

这是一个用于搜索“符号运算符”(实际上是方法)的资源,但我还没想出如何在scalex中搜索“#”以进行搜索。

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