2014-12-28 2 views
1

스칼라 사양. Chapter 3, 기록 : 사양 - 올바른 용어 SimpleType [유형] [유형]의 용도는 무엇입니까?

Type    ::= FunctionArgTypes ‘=>’ Type 
         | InfixType [ExistentialClause] 
    FunctionArgTypes ::= InfixType 
         | ‘(’ [ ParamType {‘,’ ParamType } ] ‘)’ 
    ExistentialClause ::= ‘forSome’ ‘{’ ExistentialDcl 
          {semi ExistentialDcl} ‘}’ 
    ExistentialDcl ::= ‘type’ TypeDcl 
         | ‘val’ ValDcl 
    InfixType   ::= CompoundType {id [nl] CompoundType} 
    CompoundType  ::= AnnotType {‘with’ AnnotType} [Refinement] 
         | Refinement 
    AnnotType   ::= SimpleType {Annotation} 
    SimpleType  ::= SimpleType TypeArgs 
         | SimpleType ‘#’ id 
         | StableId 
         | Path ‘.’ ‘type’ 
         | ‘(’ Types ‘)’ 
    TypeArgs   ::= ‘[’ Types ‘]’ 
    Types    ::= Type {‘,’ Type} 

이의 다음 다시 작성을 생각해 보자 :

Type 

InfixType 

CompundType 

AnnotType 

SimpleType 

SimpleType [Type] 

SimpleType [Type] [Type] 

그래서 SimpleType [Type] [Type] 유효한 유형을 보인다. 적어도이 문법에서는 유효한 문장이 될 것입니다. 올바르게 이해할 수 있습니까?

이러한 형식 식은 어떤 용도로 사용됩니까?

다른 말로하면 SimpleType [Type] [Type] 인 스칼라 프로그램을 작성하고 컴파일 할 수 있습니까?

그렇다면 어떻게됩니까? 그렇지 않다면 왜 안 되겠습니까? 유효하지 않는 한

는 스칼라의 문법에

SimpleType ::= SimpleType TypeArgs

을 갖는 점은 무엇입니까? 이 문법적으로는 AST로 해석 될 것입니다,하지만이 - -

+2

재 작성 순서가 잘못되었습니다. –

+1

무엇이 잘못 되었나요? – jhegedus

답변

8

파서 그래서 그래, 단지 컴파일러의 단계 중 하나입니다 그것은 의미 유효 AST되지 않습니다.

구문 분석 : 구문 분석하지

scala> val a: List[Int][Int] = null 
<console>:13: error: List[Int] does not take type parameters 
    val a: List[Int][Int] = null 
     ^

는 :

scala> def aaa[A][B] 
<console>:1: error: '=' expected but '[' found. 
    def aaa[A][B] 
      ^

scala> trait A[A][B] 
<console>:1: error: ';' expected but '[' found. 
     trait A[A][B] 
       ^

그래서, 당신이 그런 유형을 정의 할 수 있으나, 이에 참조 할 것 같다. 더 깊게, 스칼라는 아직 (타입 생성자만큼) 타입 파라미터를 완벽하게 지원하지 않습니다. 그래서 이제는 스칼라를 카레 시도하지 않지만 앞으로 가능할 것입니다.

UPDATE : 그러나, 여전히 타입 정의 내부 [A][B]를 갖는 예를 찾을 수 없습니다

scala> object Def1 { def apply[T] = 0 } 
defined object Def1 

scala> object Def2 { def apply[T] = Def1 } 
defined object Def2 

scala> Def2[Int][Int] 
res0: Int = 0 

:

은 실제로 당신이 적용 할 수있는 뭔가를 호출하는 경우와 같은 구문이 실제로 작동 예를 들어,이 미래를 위해 예약 된 기능 일 수 있습니다.

+0

이것이 문법에있는 이유는 앞으로 형식 매개 변수에 대해 카레를 추가 할 가능성을 남겨 두는 것입니다. – jhegedus

+0

그럼'val a : List [Int] [Int] = null'은 구문 상 정확하지만 의미 상으로는 (아직) 아닌가? – jhegedus

+0

1) 나는 (버그 또는 파서의 특정 해결 방법 일 수도있다.) 최소한이 변명을 가지고 있기를 바란다. :) 2) yes – dk14

관련 문제