Haskell &引用;“函数中的非穷举模式”;在函数调用之前追加值时出错

Haskell &引用;“函数中的非穷举模式”;在函数调用之前追加值时出错,haskell,pattern-matching,non-exhaustive-patterns,guard-clause,Haskell,Pattern Matching,Non Exhaustive Patterns,Guard Clause,我不确定我没有处理什么。假设我有一个函数,它将整数转换为字符串。称之为转换器 现在,要将位置整数转换为字符串,我只需调用converter。要将负整数转换为字符串,我将-附加到转换器调用中 这是我的代码: converter :: Integer -> String converter x | x == 0 = "0" | x == 1 = "1" | x == 2 = "2" | x == 3 = "3" | x == 4 = "4" |

我不确定我没有处理什么。假设我有一个函数,它将整数转换为字符串。称之为转换器

现在,要将位置整数转换为字符串,我只需调用
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 :: NegOrPosInteger -> String
negOrPosConverter (ActualInt x)
    | x >= 0 = converter x
    | x < 0 = '-' : converter (-x)
negOrPosConverter::NegOrPosInteger->String
负变频器(执行器x)
|x>=0=转换器x
|x<0='-':转换器(-x)
注意
转换器(-x)
而不是
转换器x



另外,如果这不仅仅是为了练习,请注意,
show
函数已经存在于Prelude中,用于将数字(以及许多其他东西)转换为字符串。

问题在于,
converter
仅为非负数定义。当一个
“-”
为负数时,您在前面加了一个前缀,但忘记了将传递给它的实际数字反转。请尝试以下方法:

negOrPosConverter :: NegOrPosInteger -> String
negOrPosConverter (ActualInt x)
    | x >= 0 = converter x
    | x < 0 = '-' : converter (-x)
negOrPosConverter::NegOrPosInteger->String
负变频器(执行器x)
|x>=0=转换器x
|x<0='-':转换器(-x)
注意
转换器(-x)
而不是
转换器x



另外,如果这不仅仅是为了练习,请注意,
show
函数已经存在于Prelude中,可以将数字(以及许多其他东西)转换为字符串。

可以工作。我只是想澄清一下,当我做
“-”+(converter x)
,到底是什么传递到
converter
,然后使我的代码失败?我想把它放在括号中,只需将
x
传递给转换器,然后添加
-
?是的。只是为了学习和习惯Haskell编程。@user2719875它只是将
x
传递给转换器。问题是在这种情况下,
x
是负数,
converter
对负数不起作用。@user2719875
'-':
的作用与
“-”+
完全相同<代码>:
只允许您一次添加一个元素,比
++
更有效。好吧,那么
转换器(-x)
基本上就是解决问题的方法,对吗?行
x<0='-':converter(-x)
表示,如果
x<0
即为负整数,则在对其求反(
converter(-x)
)后,将其作为参数传递给
converter
,使其在传递给
converter
时为正。@user2719875如果你看一下
(++)
的定义,你会发现相关的情况是
(x:xs)++ys=x:xs++ys
,而
“-”
'-':[]
,因此
“-”++converter x
相当于
'-':converter x
,它将
'-'
前置到
转换器x
的结果中。我只是想澄清一下,当我做
“-”+(converter x)
,到底是什么传递到
converter
,然后使我的代码失败?我想把它放在括号中,只需将
x
传递给转换器,然后添加
-
?是的。只是为了学习和习惯Haskell编程。@user2719875它只是将
x
传递给转换器。问题是在这种情况下,
x
是负数,
converter
对负数不起作用。@user2719875
'-':
的作用与
“-”+
完全相同<代码>:只允许您一次添加一个元素,比
++
更有效。好吧,那么
转换器(-x)
基本上就是解决问题的方法,对吗?行
x<0='-':converter(-x)
表示,如果
x<0
即为负整数,则在对其求反(
converter(-x)
)后,将其作为参数传递给
converter
,使其在传递给
converter
时为正。@user2719875如果你看一下
(++)
的定义,你会发现相关的情况是
(x:xs)++ys=x:xs++ys
,而
“-”
'-':[]
,因此
“-”++converter x
相当于
'-':converter x
,它在
转换器x的结果前面加上一个
'-'
。侧注:如果((0请记住打开警告,以便在编译时发现这些问题。如果您有一个防护列表
|条件=something |条件2=something |…
最后一个应该是
。|否则=something
,以确保捕获所有剩余的情况。旁注:您可以更换
转换器的主体e> 使用
if((0请记住打开警告,以便在编译时发现这些问题。如果您有一个警卫列表
|条件=something |条件2=something |…
,最后一个应该是
。|否则=something
,以确保捕获所有剩余的案例。