ReadP

GHCのメジャーバージョンが知らぬ間に7に!」というくらいHaskell離れしてましたが,とあるスクリプトを作るために久しぶりに使ってみた。
とりあえず必要なのはParserCombinator。以前に作った自前のモノでもよいのだが,今回はReadPを使うことにした(Text.ParserCombinators.ReadP)。
何というか,関数型言語的な考え方を忘れてしまったので,まずは簡単なサンプルとして足し算の式を読み取ってその和を返すというものを作成。

import Text.ParserCombinators.ReadP
import Char

number :: ReadP Int
number = (munch1 isDigit) >>= return . read

add :: ReadP Int
add = do { a <- number
         ; string "+"
         ; b <- number 
         ; return (a + b)
         }

ghciで確認。

*Main> readP_to_S number "1"
[(1,"")]
*Main> readP_to_S add "1+2"
[(3,"")]

どうやら狙ったものは作成できたらしい。returnの存在になかなか気付かなくって"ReadP Int"をどう作成すれば良いか悩んだ。ReadPはMonadインスタンスだからreturnが使えるということを失念していた。

ReadPを使えそうな手応えを得たので本チャンの作業に取り掛かるか。