summaryrefslogtreecommitdiff
path: root/solveRPN.hs
diff options
context:
space:
mode:
Diffstat (limited to 'solveRPN.hs')
-rw-r--r--solveRPN.hs15
1 files changed, 15 insertions, 0 deletions
diff --git a/solveRPN.hs b/solveRPN.hs
new file mode 100644
index 0000000..051999d
--- /dev/null
+++ b/solveRPN.hs
@@ -0,0 +1,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