Scala 用类型别名描述递归语法

Scala 用类型别名描述递归语法,scala,recursive-datastructures,recursive-descent,type-alias,fastparse,Scala,Recursive Datastructures,Recursive Descent,Type Alias,Fastparse,如何使用类型别名描述此递归语法: type FieldValue = Seq[String] :+: String :+: Int :+: Long :+: CNil type FieldLeaf = FieldValue :+: SubField :+: CNil type SubField = Seq[Field] type Field = (String, FieldLeaf) 目前,Scala编译器(2.12.1)为我提供了: Error:(14, 25) illegal cyclic

如何使用类型别名描述此递归语法:

type FieldValue = Seq[String] :+: String :+: Int :+: Long :+: CNil
type FieldLeaf = FieldValue :+: SubField :+: CNil
type SubField = Seq[Field]
type Field = (String, FieldLeaf)
目前,Scala编译器(2.12.1)为我提供了:

Error:(14, 25) illegal cyclic reference involving type FieldLeaf
  type Field = (String, FieldLeaf)
PS本文的上下文是使用解析递归语法


编辑(回应@OlivierBlanvillain下面的回答)

这个答案真的很美,正是我想要的,我会记住它的

然而,出于其他原因,在这个特殊情况下,我不得不使用以下定义:

  case class Field(name: String, leaf: FieldLeaf)
  sealed trait FieldLeaf
  sealed trait FieldValue extends FieldLeaf
  case class StringsFieldValue(value: Seq[String]) extends FieldValue
  case class StringFieldValue(value: String) extends FieldValue
  case class IntFieldValue(value: Int) extends FieldValue
  case class LongFieldValue(value: Long) extends FieldValue
  case class SubField(value: Seq[Field]) extends FieldLeaf

另见:
使用定点类型。例如:

case class Fix[F[_]](out: F[Fix[F]])
允许您编写:

type FieldValue = Seq[String] :+: String :+: Int :+: Long :+: CNil
type FieldLeaf[F] = FieldValue :+: SubField[F] :+: CNil
type SubField[F] = Seq[F]
type Field0[F] = (String, FieldLeaf[F])

type Field = Fix[Field0]

什么是
CNil
:+:
?另外,也许你可以解释它应该有什么结构,也许是设计错误。去掉
type子字段
并使用
Seq[Field]
应该可以解决您的问题,但可能有更好的解决方案,例如创建其他类。抱歉@Rumid,应该包含导入。为了简洁起见,我把它们排除在外。它是不成形的。