我有一個函數返回Floats(或其他類型)。我在ghci中使用我的程序作爲模塊。如何在程序的某些部分打印出信息?例如,如果我檢測到某個函數的輸入錯誤,我該如何輸出錯誤信息?在Haskell中打印
1
A
回答
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。
相關問題
- 1. Haskell打印聲明
- 2. 在Haskell中打印字符串模式
- 3. 在Haskell中調用打印功能
- 4. Haskell打印水平線
- 5. 在Haskell樹上遍歷打印
- 6. ghci中的Haskell打印整數矩陣
- 7. Haskell中:打印案件編號
- 8. Haskell打印並使用monad的值
- 9. Haskell - 執行後打印跟蹤
- 10. 如何在Haskell中打印n次相同的字符
- 11. 在haskell中打印非豐富數字的總和
- 12. 如何在haskell中打印一個列表?
- 13. 在Haskell中,一個漂亮的打印遞歸深度如何?
- 14. 在gtk2hs中使用Gtk.Printing/cairo/pango進行打印 - 在Haskell中進行打印操作
- 15. 在WPF中打印/打印預覽
- 16. 在Java中打印雙面打印
- 17. 在python中打印以前的打印?
- 18. 在ZEBRA標籤打印機中打印
- 19. 如何在javascript中打印打印區域進行打印
- 20. 如何在Haskell評估之前打印函數的參數?
- 21. 使用putChar後,haskell-mode在同一行打印「* Main>」?
- 22. 從haskell-src-exts中修改漂亮的打印機
- 23. 是否可以使用WinHugs打印Haskell中的所有縮減?
- 24. 如何從Haskell中的子線程打印錯誤?
- 25. 打印在cmd中
- 26. 打印在Perl中
- 27. 在angularjs中打印
- 28. 打印在Java中
- 29. 在emacs中打印
- 30. 如何在Haskell中打印出二進制文件中的字節?
你見過Haskell教程嗎? http://www.haskell.org/tutorial/io.html –