次のように、コンマで区切られた 2 つまたは 3 つの数値を処理できるパーサーを作成できます。
number :: Parser Int
number = many1 digit >>= return . read <?> "number"
numbers = do
n1 <- number
n2 <- char ':' >> number
n3 <- optionMaybe $ char ':' >> number
return ... -- return all of n1, n2, n3
数字だけが重要で、残りは破棄できます。n1,n2,n3
外部で処理するために中間解析結果 ( ) を連結する方法はありinput
ますか? たとえば、Scala のパーサー コンビネーターは次のことができます。
def numbers: Parser[Int ~ Int ~ Option[Int]] = // only the important numbers are returned
number ~ (":" ~> number) ~ opt(":" ~> number)
さまざまな場所でパーサーをパターン一致させるために、これを行いたいと考えています。たとえば、Scala では次のようなことができます。
val result = input.parseAs(numbers) {
case n1 ~ n2 ~ None => // work with n1,n2
case n1 ~ n2 ~ Some(n3) => // work with n1,n2,n3
}
ここで、入力は解析する文字列です。parsec には、同様の動作を可能にする組み込み関数がありますか? そうでない場合、自分でそのような動作を構築する方法はありますか?