jhe*_*dus 12 grammar types scala
介绍:
根据我的理解,类型声明{type ?[?] = Either[A, ?]}
代表任何具有其他类型?[?]
作为其成员的类型(与方法是类的成员完全相同).这是一种结构类型,即它的结构是它具有类型别名声明?[?]
作为其成员.
在另一方面,({type ?[?] = Either[A, ?]})#?
是指仅 ?
由于经由类型的投影#
.
题:
为什么{type ?[?] = Either[A, ?]}
在进行类型投影时需要括号?为什么不只是{typeλ[α] = [A,α]}#λ?
换句话说,什么是确切的解析树为({type ?[?] = Either[A, ?]})#?
根据Scala的类型声明语法(见下文)?
为什么{type ?[?] = Either[A, ?]}#?
这个语法中没有正确的"句子"?
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}
Run Code Online (Sandbox Code Playgroud)
Gab*_*lla 12
你还需要考虑
CompoundType ::= AnnotType {‘with’ AnnotType} [Refinement]
| Refinement
Refinement ::= [nl] ‘{’ RefineStat {semi RefineStat} ‘}’
RefineStat ::= Dcl
| ‘type’ TypeDef
|
Run Code Online (Sandbox Code Playgroud)
#
只能跟随一个SimpleType
,但是{type ?[?] = Either[A, ?]}
一个Refinement
,最终是一个Type
.
SimpleType
从泛型获得a的唯一方法Type
是用括号括起来.
SimpleType
'(' Types ')' '#' id
'(' Type ')' # id
'(' InfixType ')' # id
'(' CompoundType ')' # id
'(' Refinement ')' # id
'(' '{' RefineStat '}' ')' # id
'(' '{' 'type' TypeDef '}' ')' # id
...
({ type ?[?] = Either[A, ?] })#?
Run Code Online (Sandbox Code Playgroud)
#
要求SimpleType
:
SimpleType ‘#’ id
但是,{ … }
是一个Refinement
(见CompoundType
),SimpleType
除非括号括起来(见‘(’ Types ‘)’
).
所以,解析树({type ?[?] = Either[A, ?]})#?
如下:
SimpleType ‘#’ id
/ \
‘(’ Types ‘)’ '?'
|
Type
=
InfixType
=
CompoundType
=
Refinement
Run Code Online (Sandbox Code Playgroud)