Введение:
В соответствии с моим пониманием объявление типа {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}