处理Haskell中的函数错误

时间:2013-11-14 17:56:02

标签: haskell

我有一个sign函数,可以返回错误。

signe :: Int -> Char
signe chiffre
    | chiffre >= 1 && chiffre <= 9 = '+'
    | chiffre == 0 = '0'
    | chiffre >= -9 && chiffre <= (-1) = '-'
    | otherwise = error "Erreur in the sign"

我想制作一个简单的代码来返回符号的相应代码,并进行错误处理。

signes liste = [ signe x | x<-liste ]

我举个例子:现在,如果我打电话

signes [1,3,0,-10]

它给了我

  

++ 0 ***例外:签名错误。

我想要什么,而不是例外:++0

3 个答案:

答案 0 :(得分:3)

在这种情况下,你可以而且应该使用Maybe

signe chiffre 
   | chiffre >= 1 && chiffre <= 9 = Just '+'
   ....
   | otherwise = Nothing    -- parbleu!!

signes = mapMaybe signe

您可能需要为mapMaybe函数导入Data.Maybe。

答案 1 :(得分:2)

更好的方法是实际使用Maybe类型,让您真正返回NothingJust aValue。您可以将您的功能重写为

signe :: Int -> Maybe Char
signe chiffre
    | chiffre >= 1 && chiffre <= 9 = Just '+'
    | chiffre == 0 = Just '0'
    | chiffre >= (-9) && chiffre <= (-1) = Just '-'
    | otherwise = Nothing

答案 2 :(得分:0)

Ingo似乎已经回答了这个问题,但我想指出,既然你在原始问题中有错误信息,或许“Either”会是更好的选择

signe :: Int -> Either String Char
signe chiffre
    | chiffre >= 1 && chiffre <= 9 = Right'+'
    | chiffre == 0 = Right '0'
    | chiffre >= -9 && chiffre <= (-1) = Right '-'
    | otherwise = Left "Erreur in the sign"

您可以使用

获取已过滤的列表
signes liste = [ x | Right x<-map signe liste ]

Maybe和Either都用于错误检查,或者让你能够在调用链上传递“异常”。