我正在尝试从动态填充的列表中进行以下操作:
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情况吗?
答案 0 :(得分:4)
我将假设您正在与RegexParsers
或其后代之一合作。如果是这样,那么问题只是从String
到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
方法提供自己的起始值。