2

我正在尝试从动态填充的列表中进行以下操作:

val primitives = "x" | "y" | "z" // what I want

val primitives2 = List("x", "y", "z") // what I need to transform from

我认为这样的事情可能会奏效:

primitives2.reduce(_|_)

但是不行。然后我找到了这个片段,它有效:

primitives2.foldRight(failure("no matching delimiter"): Parser[Any])(_|_)

但是,基本情况failure("no matching delimiter")令人困惑。这只是 Parser 对象的等效 Nil 情况吗?

4

1 回答 1

4

我将假设您正在使用RegexParsers它或其后代之一。如果是这样,那么问题只是从Stringto的隐式转换Parser[String]不会自动启动reduce(_ | _)。如果您首先显式转换列表中的每个项目,如下所示:

val anyPrimitive = primitives2.map(literal).reduce(_ | _)

你会很好的——除了这会给你留下一些令人困惑的错误消息,就像这样:

scala> parser.parseAll(parser.anyPrimitive, "a")
res8: parser.ParseResult[Any] = 
[1.1] failure: `z' expected but `a' found

a
^

如果您想要更清晰的错误消息,那么您需要使用该方法提供您自己的起始值fold

于 2013-01-19T01:33:28.613 回答