Scala解析器组合器:如何在与"into"结合时返回中间解析器的内容?

sca*_*1sk 2 parsing scala

这是我想要做的:

def parser = parser_a >> {
  case a => val c = compute(a) ; parser_b(c)
} ^^ {
  case a ~ b => (a, b)
}
Run Code Online (Sandbox Code Playgroud)

当然它不起作用,因为^^运算符后的函数只得到结果parser_b.我怎样才能保持结果parser_a

Tra*_*own 6

您可以使用解析器是monadic的事实来编写它,如下所示:

val parser = for {
  a <- parser_a
  b <- parser_b(compute(a))
} yield (a, b)
Run Code Online (Sandbox Code Playgroud)

或者,您可以在解决方案中更改以下行(请注意,success这只是一般monadic的一个不太具体的版本return).

  case a => val c = compute(a) ; success(a) ~ parser_b(c)
Run Code Online (Sandbox Code Playgroud)

不过,我个人觉得这种for理解在这种情况下更加清晰.