List 分析案例类列表
我是scala的新手,我想分析一个案例类列表:List 分析案例类列表,list,class,scala,parsing,List,Class,Scala,Parsing,我是scala的新手,我想分析一个案例类列表: abstract class D case class D0(a: Int, b: Int) extends D case class D2(c: String, d: Int) extends D case class D3(e: Int, f: String) extends D case class D4(e: String, f: String, g: Int) extends D 我想解析List[D]的一个实例。 列表中有一个特殊的顺
abstract class D
case class D0(a: Int, b: Int) extends D
case class D2(c: String, d: Int) extends D
case class D3(e: Int, f: String) extends D
case class D4(e: String, f: String, g: Int) extends D
我想解析List[D]的一个实例。
列表中有一个特殊的顺序,可以用类似BNF的符号来解释:
rep(D0 -> D4 -> rep(D2 -> opt(rep(d3))))
D0后面跟着D4后面跟着1-n D2,每个D2后面跟着1-n D3,依此类推
我要创建以下类型的列表:
type T0 = (D0, D4, List[(D2, List[D3])])
到目前为止,我所找到的所有解决方案都是丑陋的、毫无状态的。
有经验的scala开发人员如何实现这一点
谢谢你这对我来说并不难看(假设我正确理解了这个问题,这通常不称为解析):
这在我看来并不难看(假设我正确理解了这个问题,这通常不称为解析):
你从哪里解析?例如,您的输入格式是什么?列表[D]与您建议的结构不同。清单就是清单。您的结构是另一种。列表[D]是从基于文件的遗留数据库导入的,该数据库具有实现分层数据库模型的不同记录类型。您从中解析什么?例如,您的输入格式是什么?列表[D]与您建议的结构不同。清单就是清单。你的结构是另一回事。列表[D]是从一个基于文件的遗留数据库导入的,该数据库具有实现分层数据库模型的不同记录类型。我仍然需要验证所提供的解决方案,在这种特殊情况下可能还可以。对于功能性scala来说,它仍然是新的,对我来说并不容易,特别是如果案例数量将增加。我仍然需要验证提出的解决方案,在这种特殊情况下可能还可以。对于functional scala来说,这看起来并不容易,特别是如果案例数量将增加。
type T1 = (D2, List[D3])
// MatchError if the list doesn't look the way you expected
def matchList(l: List[D]): List[T0] = l match {
case (d0: D0) :: (d4: D4) :: tail =>
val (d2d3s, tail1) = matchD2D3s(tail)
(d0, d4, d2d3s) :: matchList(tail1)
case Nil => Nil
}
def matchD2D3s(l: List[D]): (List[T1], List[D]) = l match {
case (d2: D2) :: tail =>
val (d3s, tail1) = tail.span(_.isInstanceOf[D3])
val (otherD2D3s, tail2) = matchD2D3s(tail1)
((d2, d3s) :: otherD2D3s, tail2)
case l => (Nil, l) // no d2s
}