2

I'm trying to make the following, from a dynamically filled List:

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

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

I figured something like this might work:

primitives2.reduce(_|_)

But no go. I then found this snippet, which works:

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

However, the base case failure("no matching delimiter") is confusing. Is that just the equivalent Nil case for Parser objects?

1 Answer 1

4

I'm going to assume that you're working with RegexParsers or one of its descendants. If so, then the issue is just that the implicit conversion from String to Parser[String] won't kick in automatically with reduce(_ | _). If you explicitly convert every item in your list first, like this:

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

You'll be perfectly fine—except that this will leave you with slightly confusing error messages, like this:

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

a
^

If you want a clearer error message, then you'll need to provide your own starting value using the fold approach.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.