以下是我要做的事情:
def parser = parser_a >> {
case a => val c = compute(a) ; parser_b(c)
} ^^ {
case a ~ b => (a, b)
}
当然它不起作用,因为^^
运算符之后的函数只得到parser_b
的结果。如何保留parser_a
的结果?
答案 0 :(得分:6)
你可以使用解析器是monadic的事实来编写它,如下所示:
val parser = for {
a <- parser_a
b <- parser_b(compute(a))
} yield (a, b)
或者,您可以在解决方案中更改以下行(请注意success
这里只是一般monadic return
的一个不太具体的版本。)
case a => val c = compute(a) ; success(a) ~ parser_b(c)
我个人觉得for
- 在这种情况下理解力更加清晰。