Ошибка «Неисчерпывающие шаблоны в функции» при добавлении значения перед вызовом функции - PullRequest
1 голос
/ 25 мая 2019

Я не уверен, что я не обращаюсь. Предположим, у меня есть функция, которая преобразует целое число в строку. Назовите это 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

Есть идеи, почему?

1 Ответ

6 голосов
/ 25 мая 2019

Проблема в том, что converter определяется только для неотрицательных чисел. Вы добавляете "-", когда он отрицательный, но вы забыли инвертировать действительное число, которое вы передаете ему. Попробуйте вместо этого:

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

Примечание converter (-x) вместо converter x.


Также, если это не только для практики, обратите внимание, что функция show уже существует в Prelude для преобразования чисел (и многих других вещей) в строки.

...