みどりねこ日記

よくわからないけど、頑張りますよ。

Haskellのモナド3(2)

入力をパースする伝統的な方法として一つづつ文字を消費する関数を書くという方法があります。すなわち、文字列をとって、それを切り離して、もしそれの先頭が予め決めた条件(例えば、大文字しか受け付けないという条件)を満たすならそれらを順次消費していきます。しかし、もし文字列の先頭がその条件を満たさないならば、パースは”失敗”しているといい、したがって、パーサはMaybeを用いて作られることが多いです。

ここではmplusを用いて2つのパーサを並行して実行しています。つまり、もし最初のパーサが成功したらその結果を使い、もし失敗したら、2つ目の結果を用います。どちらのパーサも失敗した場合、全体としてNothingを返します。

-- 入力の中の数値を消費し、パースされた数値を返します。do記法を使って、どの段階で失敗してもMaybeモナド(Nothing)が返るようになっています
digit :: Int -> String -> Maybe Int
digit i s
	| i > 9 || i < 0 = Nothing
	| otherwise = do
		let (c:_) = s
		if read [c] == i then Just i else Nothing
-- バイナリ文字(0, 1)を消費します
binChar :: String -> Maybe Int
binChar s = digit 0 s `mplus` digit 1 s