最初にパーサを書くのが正当なような気がするものの。先に内部表現を書いてしまうのが「あ、やっぱりオレだ」と思う瞬間。昔、インタプリタを書いたときもそうだったっけ。
data Elem = Plus | Minus | Times | Divide | Value Int calc :: [Elem] -> Int calc es = calc' es [] where calc' :: [Elem] -> [Int] -> Int calc' [] [n] = n calc' ((Value n):es) ns = calc' es (n:ns) calc' (Plus:es) (n:m:ns) = calc' es ((m + n):ns) calc' (Minus:es) (n:m:ns) = calc' es ((m - n):ns) calc' (Times:es) (n:m:ns) = calc' es ((m * n):ns) calc' (Divide:es) (n:m:ns) = calc' es ((m `div` n):ns) main = do print $ calc [Value 10, Value 4, Times, Value 20, Divide] -- 逆ポーランド(10 4 * 20 /)になってます