適当入門

現在『ふつうのHaskell』を片手に勉強中。
とりあえず言語を最初に学ぶときは電卓を作る。
というのが自分の言語の学び方なので作ってみた。
うーむ、Haskellらしい書き方ってのがイマイチ理解できていない......
まぁ、最初だから適当にでっち上げれば良いか。

import Text.ParserCombinators.Parsec
main = catch (sequence_ $ repeat evalLine)
	(const $ return())
evalLine = do
	line <- getLine
	let exec = parse addp "" line
	case exec of Right v -> print v ; Left _ -> return()
atomp = between (many space) (many space) $
	between (char '(') (char ')')
		addp <|> (many1 digit>>=return.read)
mulp = atomp>>= loop where
	f c g = char c >> atomp >>= loop.g
	loop v = f '*' (v*) <|> f '/' (div v) <|>
		f '%' (mod v) <|> return v
addp = mulp >>= loop where
	f c g = char c >> mulp >>= loop.g
	loop v = f '+' (v+) <|> f '-' (v-) <|> return v

とりあえずParsec使うと構文の解析が異常に楽になった。