2013-11-14 93 views
2

我有一个sign函数,它可能会返回一个错误。Haskell函数中的处理错误

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

+1

我想通过“嗨大家”开始我的消息,但即使编辑它没有考虑到... – Maxime

回答

3

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

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

signes = mapMaybe signe 

您可能需要进口Data.Maybe为mapMaybe功能。

+0

mapMaybes - >“不在范围内”。 (我已经在我的工作表的顶部添加了“import Data.List”) 所以我刚刚尝试过signes = map signe 但是我得到了[只是'+',........,Nothing ] – Maxime

+0

它实际上只是'mapMaybe'。 [见文档](http://hackage.haskell.org/package/base-4.6.0.1/docs/Data-Maybe.html#v:mapMaybe)。 –

+1

谢谢你指出,@AlexReinking,它实际上是'mapMaybe',它在Data.Maybe中。总是把它和'catMaybes'混淆,最后有一个s。上面的结果。 – Ingo

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 
0

的问题似乎已经被英戈回答,但我想指出的是,因为你在原来的问题有一个错误信息,也许“或者”会是一个更好的选择这里

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 ] 

两个也许,要么被用于错误检查过滤列表,要么给你传递的能力呼叫链上的“例外”。