2013-02-25 75 views
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 
+1

當您嘗試編譯或運行此命令時是否出現錯誤?將問題中的具體問題發佈給人們儘可能多的信息是很好的。 – 2013-02-25 05:26:04

+0

您的大小寫語法錯誤。當你不關心它與什麼相匹配時,你應該使用'_ - >'。在案例模式匹配後,當需要放置多個語句時,還可以使用'do'。 – Satvik 2013-02-25 18:48:47

+0

好的我認爲_ - >爲此表示感謝,但我對您的評論的後半部分涉及'做'感到困惑?我是否像這樣使用它: do putStrLn「輸入表達式或'結束'退出計算器」 或在不同的地方? – CodeNewbie 2013-02-25 18:57:15

回答

3

與您的代碼

  • until幾個問題不正確使用。當我不得不一次又一次地重複同樣的行動時,我發現最好緩和一下。你可以編寫單一版本的until並使用它。
  • 最好在主內使用getArgs一次。你不需要每次重複。

修正版本在這裏。我沒有實現所有的功能,所以你仍然需要做解析和評估表達式的努力工作。

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 
+0

好吧,這是有道理的。我完成了評估表達式,但我不知道如何設置除非函數 – CodeNewbie 2013-02-25 16:03:11

+0

@ user2106089我不清楚你通過設置'除非'意味着什麼。除非:: Monad m => Bool - > m() - > m()',否則'unless'的類型是''。如果第一個參數的值是「True」,那麼它執行動作(第二個參數),否則執行'return()'。 – Satvik 2013-02-25 18:20:03

+0

我改變了我的主要一點,現在我得到這個錯誤: 模式解析錯誤:表達式==「結束」 繼承人我的主要和病態的評論,其中的錯誤是 – CodeNewbie 2013-02-25 18:30:42