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")は紛らわしいです。これは、パーサーオブジェクトの同等のNilケースですか?

4

1 に答える 1

4

あなたが、RegexParsersまたはその子孫の1人と一緒に作業していると仮定します。その場合、問題は、から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アプローチを使用して独自の開始値を提供する必要があります。

于 2013-01-19T01:33:28.613 に答える