wvogel日記

自分用の技術備忘録が多めです.

Parsec(2) test

Parsecを調べたら出てくるサイト達、並びに友人が書いてくれた記事を元に勉強を続ける。


とりあえず、多分一番成果が出やすく作業も進めやすいのは電卓だろうということで。
私も電卓を作ることを目標とする。
まずは数値の読み込み。

import Text.ParserCombinators.Parsec
 
main = run number "1+2+3"
 
run :: Show a => Parser a-> String -> IO()
run p input = case (parse p "test" input) of
                Left err -> putStrLn "parse error"
                Right x -> print x

number :: Parser Float
number = many1 digit >>= \l -> return $ read l

するとちゃんと1.0が返ってきた。
この作業自体はすぐに出来た。
当然か
因みに、パーサーにかける式を"123+543"とかすると、ちゃんと123.0が戻ってきた。
このrunという関数、モジュール内ではparseTest関数として用意されています。
ただこの名前が、実際に使用する上ではあまりよろしくないので、run関数を、

run :: Show a => Parser a-> String -> IO()
run = parseTest

として宣言して使ってやるのも良いかも。

many1の機能がこれでどんなものかわかります。
値マッチが成功する間値を返し続けるんですね。
そういう意味じゃtakeWhileに似てる


次は、(+)か