wvogel日記

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

書初め

ブログ放置しすぎてた。


夏ごろの完成を目処に製作中のものがあるので、
ひとまずはその公開を目標に今年も書いていきたいと思います。


2014年が始まり、今年の書初めHaskell.

以前、Parsecで割と(?)多機能というか、普通の電卓は作ったので、
今日はサクッとState monadで和差演算だけを実装した電卓。


去年はハードウェアにも本格的に手を出し始めた他、
Haskell勉強会に参加したり、
Haskellerの方にお会いしてお話しさせてもらったり。

さてさて、今年はどんな年になるでしょうか

import Control.Monad.State

type Stack = [String]
type Value = String

main = do
    expr <- getLine
    print expr
    print $ evalState (run expr) []

run :: String -> State Stack Double
run [] = do
    stack <- get
    return.read $ fst (pop stack)

run (x:xs) = do
    stack <- get
    case any (==x) "+-" of
        True  -> put (push [x] stack)
        False -> put (calc [x] stack)
    run xs

calc :: String -> Stack -> Stack
calc x [] = push x []
calc x (op:v:vs) = push (show $ ope op x v) vs

ope p x v = case p of
    "+" -> read v + read x
    "-" -> read v - read x
    otherwise -> 0

push :: String -> Stack -> Stack
push v vs = v : vs

pop :: Stack -> (Value,Stack)
pop (x:xs) = (x,xs)