我有一个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
。
答案 0 :(得分:3)
在这种情况下,你可以而且应该使用Maybe
:
signe chiffre
| chiffre >= 1 && chiffre <= 9 = Just '+'
....
| otherwise = Nothing -- parbleu!!
signes = mapMaybe signe
您可能需要为mapMaybe
函数导入Data.Maybe。
答案 1 :(得分:2)
更好的方法是实际使用Maybe
类型,让您真正返回Nothing
或Just 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都用于错误检查,或者让你能够在调用链上传递“异常”。