이 블로그 에서이 코드를 볼 수 있습니다 : Scala의 Type-Level Programming :
// 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]
있습니다. 검색 엔진이 무시하기 때문에 검색하기가 어렵 기 때문에 누가 무슨 뜻인지 알 수 있습니까?
답변
이를 설명하기 위해 먼저 스칼라에서 중첩 클래스를 설명해야합니다. 이 간단한 예를 고려하십시오.
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)
^
스칼라의 다른 클래스 내부에서 클래스를 선언하면 해당 클래스의 각 인스턴스 에 이러한 하위 클래스가 있다고 말하는 것입니다 . 즉, A.B
클래스 가 없지만 클래스가 a1.B
있으며 a2.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.
답변
형식 프로젝션이라고하며 형식 멤버에 액세스하는 데 사용됩니다.
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 ( “파운드”검색)
답변
다음은 “기호 연산자”(실제로는 메서드)를 검색하기위한 리소스이지만 scalex에서 검색하기 위해 “#”을 이스케이프 처리하는 방법을 찾지 못했습니다)