hpaste

recent | annotate | new

-- admittedly, there is no error checking

module Main where

import Control.Applicative ((<$))
import Text.ParserCombinators.Parsec

number xs = do
    x <- many1 digit
    return (read x:xs)

operate f (x:y:rest) = return (f y x:rest)
operator xs = do
    o <- oneOf "+-*/"
    case o of
        '+' -> operate (+) xs
        '-' -> operate (-) xs
        '*' -> operate (*) xs
        '/' -> operate (/) xs

singleTerm xs = number xs <|> operator xs <|> (xs <$ spaces)
expression = expression' [] >>= return . head where
    expression' xs = (xs <$ eof) <|> (singleTerm xs >>= expression')

forever m = m >> forever m
main = forever (getLine >>= parseTest expression)

-- admittedly, there is no error checking

module Main where

import Control.Applicative ((<$), (<$>))
import Text.ParserCombinators.Parsec

number xs = (:xs) . read <$> many1 digit
operate f (x:y:rest) = return (f y x:rest)
operator xs = choice [char c >> operate op xs | (c, op) <- zip "+-*/" [(+),(-),(*),(/)]]

singleTerm xs = number xs <|> operator xs <|> (xs <$ spaces)
expression = head <$> expression' [] where
    expression' xs = (xs <$ eof) <|> (singleTerm xs >>= expression')

forever m = m >> forever m
main = forever (getLine >>= parseTest expression)