1

何を扱っていないのかわからない。整数を文字列に変換する関数があるとします。それを呼び出しますconverter

ここで、位置整数を文字列に変換するには、 を呼び出すだけconverterです。負の整数を文字列に変換する-には、呼び出しに追加しconverterます。

これは私のコードです:

converter :: Integer -> String
converter x
    | x == 0 = "0"
    | x == 1 = "1"
    | x == 2 = "2"
    | x == 3 = "3"
    | x == 4 = "4"
    | x == 5 = "5"
    | x == 6 = "6"
    | x == 7 = "7"
    | x == 8 = "8"
    | x == 9 = "9"
    | x > 9 = z
    where
    (a, b) = divMod x 10
    z = (converter a) ++ (converter b)

negOrPosConverter :: NegOrPosInteger -> String
negOrPosConverter (ActualInt x)
    | x >= 0 = converter x
    | x < 0 = "-" ++ (converter x)

コードを実行して試してみると、次のnegOrPosConverter (ActualInt (-200))エラーが発生します。

"-*** Exception: theConverter.hs:(19,1)-(27,32): Non-exhaustive patterns in function converter

理由はありますか?

4

1 に答える 1

6

問題はconverter、負でない数に対してのみ定義されていることです。"-"負の場合は先頭に a を追加しますが、渡す実際の数値を反転するのを忘れました。代わりにこれを試してください:

negOrPosConverter :: NegOrPosInteger -> String
negOrPosConverter (ActualInt x)
    | x >= 0 = converter x
    | x < 0 = '-' : converter (-x)

converter (-x)の代わりに注意してくださいconverter x


また、これが練習用ではない場合は、show数値 (およびその他の多くのもの) を文字列に変換する関数が Prelude に既に存在することに注意してください。

于 2019-05-25T02:52:01.723 に答える