<div style="color:#000; font-size: 14px;font-family: arial;"><div>Dear Haskellers,<br><br>I am new to programming in haskell, recently I came up with an task to write an simple arithemtic evaluator in <br>haskell. I try to write it using Text.Parsec, it can handle binary operation and some unary operation, but will <br>give information of parsing error in some case. The following is my code<br><br><br></div><div>import Text.Parsec<br>import Text.Parsec.Expr<br>import Text.Parsec.Combinator<br>import Data.Functor<br><br>data Exp = Num Int<br>         | Add Exp Exp<br>         | Sub Exp Exp<br>         | Mul Exp Exp<br>         | Div Exp Exp<br>         | Pos Exp<br>         | Neg Exp<br><br>expr = buildExpressionParser table factor<br><br><br>table = [[op "*" (Mul) AssocRight, op "/" (Div) AssocRight]<br>        ,[op "+" (Add) AssocLeft, op "-" (Sub) AssocLeft]<br>        ,[prefix "-" (Neg), prefix "+" (Pos)]]<br>        where op s f assoc = Infix (f <$ string s) assoc<br>              prefix s f = Prefix (f <$ string s)<br><br><br>factor = between (char '(') (char ')') expr <|> (Num . read <$> many1 digit)<br><br>eval :: (Num a, Integral a) => Exp -> a<br>eval e = case e of<br>    Num x   -> fromIntegral x<br>    Pos a   -> eval a<br>    Neg a   -> negate $ eval a<br>    Add a b -> eval a   +   eval b<br>    Sub a b -> eval a   -   eval b<br>    Mul a b -> eval a   *   eval b<br>    Div a b -> eval a `div` eval b<br><br>solution :: (Num a, Integral a) => String -> a<br>solution = either (const (error "Did not parse")) eval . parse expr ""<br><br>The following is some test,<br><br><br></div><div>*Main> solution "-4/(2+3)"<br>0<br>*Main> solution "-4/(2-3)"<br>4<br>*Main> solution "-4/-2"<br>*** Exception: Did not parse<br>*Main> solution "16/-4"<br>*** Exception: Did not parse<br>*Main> solution "-16/4"<br>-4<br>*Main><br><br>Can anyone teach me how to solve this?  Thanks in advanced.<br><br><br><br></div></div><div id="spnEditorSign" name="100"><div><div>--m00nlight<br></div></div></div><div><br></div><!-- jy5ContentSuffix --><br><br><span title="neteasefooter"><span id="netease_mail_footer"><span title="neteasefooter"><span id="netease_mail_footer"><a href="#" target="_blank"></a></span></span>
</span></span>