プログラミングHaskell 8.5 選択
だいぶ間があいたけど、引き続き。
パーサーを結合させるもう一つの自然な方法は、一番目のパーサーを入力文字列に適用し、もし失敗したら、代わりに二番目のパーサーを適用することである。
+++(「または」と読む)を定義する。
def +++[A](p: Parser[A])(q: Parser[A]): Parser[A] = (inp: String) => parse(p)(inp) match { case List() => parse(q)(inp) case List((v, out)) => List((v, out)) }
実行。
object Main extends App { ... println("sample7: " + parse(+++(item)(succeed('d')))("abc")) println("sample8: " + parse(+++(failure)(succeed('d')))("abc")) }
sample7: List((a,bc)) sample8: List((d,abc))