summaryrefslogtreecommitdiff
path: root/solveRPN.hs
blob: 051999dcab556ab86f19a9b8e9d0ead02d2784ad (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import Data.List
import Control.Monad
import Text.Read

foldingFunction :: [Double] -> String -> Maybe [Double]
foldingFunction (x:y:ys) "*" = return ((y * x):ys)
foldingFunction (x:y:ys) "/" = return ((y / x):ys)
foldingFunction (x:y:ys) "+" = return ((y + x):ys)
foldingFunction (x:y:ys) "-" = return ((y - x):ys)
foldingFunction xs numberString = liftM (:xs) (readMaybe numberString)

solveRPN :: String -> Maybe Double
solveRPN st = do
    [result] <- foldM foldingFunction [] (words st)
    return result