在Haskell中打印

时间:2011-10-22 19:51:32

标签: haskell

2 个答案:

答案 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。