wvogel日記

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

電卓(+,-)

Parsecで電卓を作るべく、空腹に耐え大学で作業。
しかしあまりにも空腹なので何か食料探してくる.....そういえば昼食食べずに家でてきちゃったからなー

友人の書いたものを参考に
http://keichi.net/
まずは整数同士で。
とりえあず足し算引き算を実装。

import Text.Parsec
import Text.Parsec.String
import Control.Applicative hiding (many,(<|>))

main = getLine >>= parseTest calc

num :: Parser Float
num = read<$>many1 digit

calc :: Parser Float
calc = do a <- num
          b <- many ((char '+'
                      >> num
                      >>=return.(+))
                    <|>
                     (char '-'
                      >> num
                      >>=return.flip (-))
                 )
          return $ foldr ($)a b

中途半端にAppilicative。
これだけで連続計算ができるってすごいですね!
あとは乗除、()、小数点か。
まずは乗除ですね。
素の場合、和差より優先度が高いので、先に実行されるように、calcから呼び出すような形式をとったら良さそう。