2011-10-22 58 views
1

我有一個函數返回Floats(或其他類型)。我在ghci中使用我的程序作爲模塊。如何在程序的某些部分打印出信息?例如,如果我檢測到某個函數的輸入錯誤,我該如何輸出錯誤信息?在Haskell中打印

+0

你見過Haskell教程嗎? http://www.haskell.org/tutorial/io.html –

回答

5

這裏有幾種情況,這取決於你想要做什麼。

作爲調試方法的直接向前噴灑printf s在Haskell中不會很好地工作。

如果您有部分功能,我建議使用Either或Maybe作爲解決方案。

例如:

lookup :: (Eq a) => a -> [(a,b)] -> Maybe b 
lookup x []      = Nothing 
lookup x ((k,v):ys) | x == k = Just v 
        | otherwise = lookup x ys 

lookup需要一個鍵和鍵值對的列表,如果該鍵不在列表中只返回與該鍵關聯的值,或沒有。

doMath :: Char -> Int -> Int -> Either String Int 
doMath '+' x y = Right (x + y) 
doMath '*' x y = Right (x * y) 
doMath '/' x 0 = Left "Division by zero" 
doMath '/' x y = Right (x/y) 
doMath '-' x y = Right (x - y) 
doMath c x y = Left ("Bad operator: " ++ show c) 

要麼是如可能,因爲如果可以的話,你將返回結果。否則你拿

如果你真的函數有一個不可能的話,那麼你可以使用函數error,它拋出一個幾乎無法捕獲的錯誤與字符串。這並不美妙,但是在不可能的事情發生之後進行事後驗證時,它會幫助你指出正確的方向。

+2

「'Either'是'Right'結果,或者什麼的'Left'。」謝謝你爲這個偉大的伎倆記得如何使用'Either'! –

3

因爲沒有副作用的純代碼,你基本上有三種選擇:

可以打印錯誤消息並拋出一個異常,通常終止程序,除非你抓住它:

myDiv x 0 = error "Division by zero" 
myDiv x y = x/y 

可以打印錯誤信息並返回一些值:

import Debug.Trace 

myDiv x y = trace ("Trying to divide " ++ show x ++ " by " ++ show y) (x/y) 

您可以返回其描述以某種方式錯誤的值,例如,也許或不是String:

myDivMaybe x 0 = Nothing 
myDivMaybe x y = Just (x/y) 

myDivEither x 0 = Left "Won't divide by zero" 
myDivEither x y = Right (x/y) 

您通常使用error當輸入是真的無效,你不介意在這種情況下運行時錯誤。 trace通常用於調試目的。如果你想避免無效輸入的運行時錯誤,你可以使用Maybe或Either。