書初め
ブログ放置しすぎてた。
夏ごろの完成を目処に製作中のものがあるので、
ひとまずはその公開を目標に今年も書いていきたいと思います。
以前、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)