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

関数のために Data.Maybe をインポートする必要があるかもしれませんmapMaybe

于 2013-11-14T18:00:26.813 に答える
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
于 2013-11-14T18:00:47.690 に答える
0

この問題はすでに Ingo によって回答されているようですが、元の質問でエラー メッセージが表示されたので、ここではおそらく「どちらか」を選択することをお勧めします。

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 と Each はどちらもエラー チェックに使用されます。Either を使用すると、呼び出しチェーンに「例外」を渡すことができます。

于 2013-11-15T18:00:28.637 に答える