top page > computer > haskell > web_lecture > for_programmer > parser_numbers.html
更新日:
文責: 重城良国

数の並びのパース

数のパース

check isDigitは数字1文字をパースする。list1で数字1文字以上の文字列をパースし結果をreadで数に変換する。

number :: Parse Integer
number = list1 (check isDigit) `build` read

関数readは部分関数だ。使うのに注意が必要だ。今回は引数となる文字列は数字のみを含むことが保証されているので問題ない。

*Main> :reload
*Main> number "4492"
[(4,"492"),(44,"92"),(449,"2"),(4492,"")]
*Main> number >* eof $ "4492"
[(4492,"")]
*Main> map fst . (number >* eof) $ "4492"
[4492]
*Main> listToMaybe . map fst . (number >* eof) $ "4492"
Just 4492

すべての文字を読み込んで(>* eof)結果のみ(map fst)をMaybe値として(listToMaybe)表示した。

関数parse

結果をMaybe値としてとりだす。対話環境で行った変換を関数にする。

parse :: Parse a -> String -> Maybe a
parse p = listToMaybe . map fst . (p >* eof)

仮引数pは消せる。

parse p = ((listToMaybe . map fst) .) $ p >* eof

parse p = ((listToMaybe . map fst) .) $ (>* eof) p

parse = ((listToMaybe . map fst) .) . (>* eof)

*Main> parse number "4492"
Just 4492

空白区切りの数値のリスト

1文字以上の空白文字をパースする。

spaces1 :: Parse ()
spaces1 = list1 (check isSpace) `build` const ()

数をパースしたあとに「複数の空白文字と数字」のリストをパースする。`build`以下は(x, xs)の形のタプルをx : xsの形のリストにする。

numbers :: Parse [Integer]
numbers = (number >*> list (spaces1 *> number)) `build` uncurry (:)

*Main> :reload
*Main> parse numbers "123 456 789"
Just [123,456,789]

コンマ区切りの数値のリスト

コンマ区切りのリストでは空白文字はオプションなので0個以上とする。

spaces :: Parse ()
spaces = list (check isSpace) `build` const ()

コンマの前後にオプションの複数の空白文字をいれる。

comma :: Parse ()
comma = (spaces >*> char ',' >*> spaces) `build` const ()

数のあとに「コンマと数字」のリストを続ける。

cnumbers :: Parse [Integer]
cnumbers = (number >*> list (comma *> number)) `build` uncurry (:)

*Main> :reload
*Main> parse cnumbers "89, 95, 21, 3"
Just [89,95,21,3]

まとめ

数のリストのパースを見た。基本的な部品を組み合わせた。

「リストのパーサ」へもどる 「パーサ: 計算機」へ

正当なCSSです! HTML5 Powered with CSS3 / styling, and Semantics