プログラミング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))