Programing in Haskell / Chapter.8 Exercise (2)

Programing in Haskell(http://www.amazon.co.jp/dp/0521692695) P.85~86

Chapter8は、いつか読み直す。それなりに理解できたからOK
指数計算の部分は、名前をつける部分を見ようとしたら、カンニングしてしまった。。でも、そんなに難しくないと思われ

expr :: Parser Int
expr  =  do t <- term 
            do symbol "+"
               e <- expr
               return ( t + e )
               +++ do symbol "-"
                      e <- expr
                      return ( t - e )
               +++ return t

term :: Parser Int
term =  do f <- factor
           do symbol "*"
              t <- term
              return (f * t)
              +++ do symbol "/"
                     t <- term
                     return ( f `div` t )
              +++ return f

factor :: Parser Int
factor  =  do a <- atom
              do symbol "^"
                 f <- factor
                 return ( a ^ f )
              +++ return a

atom   :: Parser Int
atom    =  do symbol "("
              e <- expr
              symbol ")"
              return e
              +++ natural

eval     :: String -> Int
eval xs   = case parse expr xs of
            [( n, [] )] -> n
            [(_, out )] -> error ("unused input " ++ out)
            [] -> error "invalid input"