Parsec を使った計算機。
import Text.ParserCombinators.Parsec import Control.Applicative hiding ((<|>)) expr :: Parser Int expr = tok(term) >>= (\t -> ((symbol "+") >> expr >>= (\e -> return (t + e ))) <|> ((symbol "-") >> expr >>= (\m -> return (t-m))) <|> return t) term :: Parser Int term = power >>= (\p -> (symbol "*" >> term >>= \t -> return (p * t)) <|> (symbol "/" >> expr >>= \m -> return (p `div` m)) <|> return p) power:: Parser Int power = factor >>= (\f -> (symbol "^" >> power >>= \p -> return (f ^ p)) <|> return f) factor :: Parser Int factor = (symbol "(" >> expr >>= \e -> symbol ")" >> return e) <|> tok(number) symbol :: String -> Parser String symbol xs = tok (string xs) number = plus <|> minus plus :: Parser Int plus = many1 digit >>= \xs -> return (read xs) minus :: Parser Int minus = char '-' >> many1 digit >>= \xs -> return $ negate (read xs) tok :: Parser a -> Parser a tok p = spaces >> p >>= \v -> spaces >> return v
> parseTest expr " (-123 - 11 * -2) / 2 * 3" -- > -17 > parseTest expr " -123 - 11 * -2 / 2 * 3" -- > -112 > parseTest expr "2^3+2*3" -- > 14