2

我有一个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*** 例外:符号错误。

我想什么都没有,而不是 Exception: ++0

4

3 回答 3

3

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

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

signes = mapMaybe signe

您可能需要为该mapMaybe功能导入 Data.Maybe。

于 2013-11-14T18:00:26.813 回答
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
于 2013-11-14T18:00:47.690 回答
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 都用于错误检查,Either 使您能够将“异常”传递给调用链。

于 2013-11-15T18:00:28.637 回答