import Control.Applicative ((<$>)) import Data.Char (isDigit) import Control.Monad.State main :: IO () main = solve <$> getLine >>= print solve :: String -> Int solve = evalState expr num :: State String Int num = do ss@(x:xs) <- get case x of '+' -> do put $ dropWhile isDigit xs return . read . takeWhile isDigit $ xs '-' -> do put $ dropWhile isDigit xs return . negate . read . takeWhile isDigit $ xs _ -> do put $ dropWhile isDigit ss return . read . takeWhile isDigit $ ss op :: State String (Int -> Int -> Int) op = do (x:xs) <- get case x of '+' -> do put xs return (-) _ -> do put xs return (+) expr :: State String Int expr = do x <- num f <- op y <- num return $ f x y