2018-01-01から1ヶ月間の記事一覧

プログラミングHaskell 8.8 数式

自然数と加算演算子、乗算演算子、および括弧からなる数式を考える。 加算演算子と乗算子は右結合とし、乗算演算子は加算演算子よりも高い結合順序を持つとする。 「2 + 3 + 4」 は「2 + (3 + 4)」 「2 * 3 + 4」は 「(2 * 3) + 4」 を意味する。 BNFで表し…

プログラミングHaskell 8.7 空白の扱い

実用的なパーサーは、入力文字列中の「トークン」の前後に任意の空白を許す。...(中略)...あるトークンのパーサーを適用する際、前後の空白を無視する部品を定義する。 def token[A](p: Parser[A]): Parser[A] = for { _ <- space v <- p _ <- space } yield…

プログラミングHaskell 8.6 パーサーの部品

述語pを満足する一文字用のパーサー sat p を定義する。 def sat(p: Char => Boolean): Parser[Char] = { item.flatMap(x => p(x) match { case true => succeed(x) case false => failure }) } これを使えば、数字・アルファベットとかのパーサーも。 def d…

プログラミングHaskell 8.5 選択

だいぶ間があいたけど、引き続き。 パーサーを結合させるもう一つの自然な方法は、一番目のパーサーを入力文字列に適用し、もし失敗したら、代わりに二番目のパーサーを適用することである。 +++(「または」と読む)を定義する。 def +++[A](p: Parser[A])(…