描述具有类型别名的递归语法



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

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的上下文是用fastparse解析递归语法。


edit(响应 @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]

最新更新