1

这是我的新主要内容,error: parse error on input '->' 我评论了错误所在。会不会是某个地方的缩进错误?

main :: IO()
main = do
  expression <- evaluate_input
  putStrLn $ show $ compute expression

evaluate_input :: IO ()
evaluate_input = do
  args <- getArgs
  case args of
    a:s -> return a
    -> do putStrLn "Enter Expression or 'end' to exit calculator"
           hFlush stdout
           getLine
           unless (expression -> "end") $ showExpr expression --error here
  where
    showExpr expression = do putStrLn $ evaluateExpr expression
                        evaluate_input
evaluateExpr :: String -> String
evaluateExpr = show
4

1 回答 1

3

您的代码几乎没有问题

  • until没有正确使用。当我不得不一次又一次地重复相同的动作时,我发现递归更好。您可以编写 monadic 版本until并使用它。
  • 最好getArgs在 main 内使用一次。你不需要每次都重复。

更正的版本在这里。我还没有实现所有的功能,所以你仍然需要做解析和评估表达式的艰苦工作。

import Control.Monad (unless)

main :: IO ()
main = evaluate

evaluate :: IO ()
evaluate = do
  putStrLn "Enter Expression"
  expr <- getLine
  unless (expr == "end") $ showExpr expr
 where
   showExpr expr = do putStrLn $ evaluateExpr expr
                      evaluate

evaluateExpr :: String -> String
evaluateExpr = show
于 2013-02-25T05:28:15.047 回答