"Non-exhaustive patterns in function" 在函数调用前追加值时出错
"Non-exhaustive patterns in function" error when appending value before function call
我不确定我没有处理什么。假设我有一个函数,将整数转换为字符串。称之为 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
知道为什么吗?
问题是 converter
仅针对非负数定义。当 "-"
为负数时,您会在前面加上它,但您忘记反转传递给它的实际数字。试试这个:
negOrPosConverter :: NegOrPosInteger -> String
negOrPosConverter (ActualInt x)
| x >= 0 = converter x
| x < 0 = '-' : converter (-x)
注意 converter (-x)
而不是 converter x
。
另外,如果这不仅仅是为了练习,请注意 show
函数已经存在于 Prelude 中,可以将数字(以及许多其他东西)转换为字符串。
我不确定我没有处理什么。假设我有一个函数,将整数转换为字符串。称之为 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
知道为什么吗?
问题是 converter
仅针对非负数定义。当 "-"
为负数时,您会在前面加上它,但您忘记反转传递给它的实际数字。试试这个:
negOrPosConverter :: NegOrPosInteger -> String
negOrPosConverter (ActualInt x)
| x >= 0 = converter x
| x < 0 = '-' : converter (-x)
注意 converter (-x)
而不是 converter x
。
另外,如果这不仅仅是为了练习,请注意 show
函数已经存在于 Prelude 中,可以将数字(以及许多其他东西)转换为字符串。