Skip to content

Instantly share code, notes, and snippets.

@forestbelton
Created April 6, 2013 03:33
Show Gist options
  • Save forestbelton/5324640 to your computer and use it in GitHub Desktop.
Save forestbelton/5324640 to your computer and use it in GitHub Desktop.
RPN calculator in Haskell
import Control.Monad
import Data.Char
import Data.List
op f (y:x:xs) = (f x y):xs -- Pop two, evaluate, push.
parse [value] [] = value -- Done parsing, evaluate.
parse _any [] = error "wrong stack size" -- This shouldn't happen!
parse stack (' ':xs) = parse stack xs -- Ignore spaces.
parse stack ('+':xs) = parse (op (+) stack) xs -- Addition.
parse stack ('-':xs) = parse (op (-) stack) xs -- Subtraction.
parse stack ('*':xs) = parse (op (*) stack) xs -- Multiplication.
parse stack ('/':xs) = parse (op div stack) xs -- Division.
parse stack xs = parse (value:stack) rest -- Parse an integer.
where (token, rest) = span isDigit xs
value = read token :: Integer
main = forever $ do l <- getLine -- Read a line.
print (parse [] l) -- Evaluate it and print.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment