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
,以确保捕获所有剩余的案例。