import System.IO type Stack = [Integer] type Operator = Integer -> Integer -> Integer apply :: Operator -> Stack -> Stack apply f (x:y:zs) = (f y x) : zs opList :: [(String, Operator)] opList = [ ("+", (+)), ("-", (-)) , ("*", (*)), ("/", div) , ("^", (^)) ] runRPN :: [String] -> Stack -> Integer runRPN [] (t:_) = t runRPN (curr:rest) stk = case lookup curr opList of Just op -> runRPN rest $ apply op stk Nothing -> runRPN rest $ (read curr) : stk main :: IO () main = interact $ unlines . map f . lines where f x = show $ runRPN (words x) []