2013-02-26 94 views
2

我在Haskell中撰寫並希望在函數中打印語句並調用另一個函數,我不知道爲什麼這不起作用。有人可能會告訴我我做錯了什麼或提供更合理的解決方案嗎?Haskell打印聲明

我的錯誤是:

Couldn't match expected type `[a0]' with actual type `IO()' 
In the return type of a call of `putStrLn' 
In a stmt of a 'do' block: putStrLn "Missing closing bracket" 
In the expression: 
    do { putStrLn "Missing closing bracket"; 
     evaluate_input } 

代碼:

bracket_content [] 0 = [] 
bracket_content (first:rest) counter 
    | is_open_bracket first = first : bracket_content rest (counter + 1) 
    | is_close_bracket first = first : bracket_content rest (counter - 1) 
    | counter == 0 = [] 
    | otherwise = first : bracket_content rest counter 
bracket_content _ _ = do putStrLn "Missing closing bracket" --error here 
         evaluate_input 

evaluate_input :: IO() 
evaluate_input = do 
    putStrLn "Enter Expression or 'q' to exit calculator: " 
    expression <- getLine 
    case expression of 
    a:as -> return a 
    unless (expression == ['q']) $ evaluate_expression expression 
where evaluate_expression e = do 
            putStrLn . show $ calculate e 
            evaluate_input 
+1

您將不再提供關鍵信息。什麼是錯誤?什麼是功能類型? – Pubby 2013-02-26 03:30:38

+0

對不起,我不清楚我編輯我的帖子上面。基本上我只想打印錯誤消息,然後調用evaluate_input。 – CodeNewbie 2013-02-26 03:46:56

+0

來自錯誤的所有代碼片段似乎都正常工作,您需要包含更多代碼。 – crockeea 2013-02-26 04:00:35

回答

1

你的問題是,你正試圖使bracket_content返回兩種不同類型。前兩個模式返回列表,而最後一個模式返回IO()。編譯錯誤表明GHC推斷(因爲你用的遞歸調用利弊(:))或從類型簽名讀bracket_content類型爲

bracket_content :: [a] -> Int -> [a] 

但你最後的模式返回IO()。我想你可能會試圖返回一個你可以稍後打印的字符列表:你在遞歸調用返回的任何地方附加一個開放的括號。

一個潛在的解決方案是讓每個模式返回IO()

bracket_content _ 0 = return() 
bracket_content (first:rest) counter 
    | is_open_bracket first = do putChar first 
           bracket_content rest (counter + 1) 
    | is_close_bracket first = do putChar first 
            bracket_content rest (counter - 1) 
    | otherwise = do putChar first 
        bracket_content rest counter 
bracket_content _ _ = do putStrLn "Missing closing bracket" 
         evaluate_input 

我不知道這是否會完成你想要的,但至少它編譯。您的版本和我的版本之間的差別是,在我的版本,每個模式返回一個IO(),讓你的函數簽名:

bracket_content :: [Char] -> Int -> IO() 

還要注意,我刪除了你的警衛

| counter == 0 = [] 

因爲我將它添加到第一個模式,如果計數器爲0,則不打印任何內容,無論列表是否爲空。

+0

我只想調用baracket_content並讓它打印一個語句並調用另一個函數。我只是困惑於如何定義它? – CodeNewbie 2013-02-26 05:16:01

+0

我用一個可能的解決方案更新了我的答案。 – crockeea 2013-02-26 05:25:47

+0

@ user2106089:我只想指出,如果你想要做的是錯誤處理,它通常更多的「haskell樣式」返回一個選擇類型,如Maybe或Either,以及實際的「錯誤處理」和外部打印的東西括號功能。 – hugomg 2013-02-26 15:10:03