2013-07-29 7 views
4

다음 코드를 이해하려고합니다. 그러나 나는 R # X가 무엇을 의미하는지 모른다. 누군가 나를 도울 수 있니?스칼라에서 A # B의 의미는 무엇입니까

// 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] 
} 
+1

간단히 말해서 R # X는 "일부 R 's X"(특정 R 's X와 대조적으로, 예를 들어 r1.X)를 의미합니다. 더 깊이 파고 싶다면 "유형 투영법"이라고합니다. 귀하의 정보에 대해 – AmigoNico

+0

감사합니다. – user1484819

답변

6

당신은 클래스의 기존 인스턴스에서 유형을 얻을 수 있습니다

class C { 
    type someType = Int 
} 
val c = new C 
type t = c.someType 

또는 직접 객체를 인스턴스화하지 않고 유형에 해결 할 수는 : C#someType이 양식은 어떤 당신이 가진 형의 표현에 매우 유용합니다 중간 변수를 만드는 공간.


의견에 제안 된대로 몇 가지 설명을 추가하십시오.

면책 사항 : 스칼라 유형 시스템의 작동 방식을 부분적으로 이해하고 있습니다. 나는 여러 번 문서를 읽으려고했으나, 거기에서 삐걱 거리는 지식만을 추출 할 수있었습니다. 하지만 나는 스칼라에서 풍부한 경험을 가지고 있으며 개별 사례에 대한 컴파일러의 행동을 잘 예측할 수 있습니다.

#

형 투영이라 입력 투영 내재적 모두 사용하는 모든 종류의 발현 스칼라 . 통해 정상 계층 형 액세스 칭찬.

스칼라 기준은 눈에 보이지 않는 변환의 예를 제공합니다 사용시피

t      ə.type#t 
Int      scala.type#Int 
scala.Int    scala.type#Int 
data.maintable.Node  data.maintable.type#Node 

는 입력 투사의 모든 사소한 사용은 사실이 아닌 객체 (즉 .type로 돌아갑니다) 유형에서 작동합니다. 실용적인 차이점 (정의가 나쁘다)은 객체 유형이 객체 자체만큼이나 일시적이라는 것입니다. 유형은 추상 클래스 유형의 상속과 같은 적절한 상황에서 변경 될 수 있습니다. 대조 유형의 유형 (유형 투영법의 정의)은 태양만큼 안정합니다. 스칼라의 유형 (클래스와 혼합하지 마십시오)은 일류 시민이 아니며 더 이상 무시할 수 없습니다.

형식 표현을 적용하기에 적합한 다른 장소가 있습니다. 안정된 유형 만 허용되는 장소도 있습니다. 그래서 기본적으로 타입 프로젝션은 타입의 용어에 대해 더 일정합니다.

+1

"유형 투영법"이라고 추가 할 수 있습니다. –

+1

답변을 업데이트하십시오. 당신은'C# someType'과'c.someType'처럼 보이게 만듭니다. 실제로는 그렇지 않습니다. 예를 들어'someType' abstract를 남겨두면 다음과 같이 컴파일되지 않습니다 :'implicitly [c.someType = : = C# comeType]'. 'c.someType'은 경로 의존형을 나타내며,'C# someType'은 타입 투영입니다. –

관련 문제