Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 分析案例类列表_List_Class_Scala_Parsing - Fatal编程技术网

List 分析案例类列表

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]的一个实例。 列表中有一个特殊的顺

我是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]的一个实例。 列表中有一个特殊的顺序,可以用类似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
}