答案 0 :(得分:5)
这里有一些案例,具体取决于你想做什么。
在Haskell中,printf
作为一种调试方法的直接向前喷洒并不能很好地发挥作用。
如果你有部分功能,我会建议使用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
获取一个键和一个键值对列表,并返回与该键关联的值,如果该键不在列表中,则返回Nothing。
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
,它会抛出一个字符串几乎无法捕获的错误。它并不漂亮,但在不可能发生之后进行验尸时,它会帮助您指明正确的方向。
答案 1 :(得分: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)
您可以以某种方式返回描述错误的值,例如也许或者是字符串:
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。