下面我展示输出。如果它们不相等,我给出一个数字列表然后返回False并且它正常工作。但如果数字列表相等则不返回True。你能查一下这段代码吗?
la [] = True
la a =
if ((head a )==head (tail a))
then la (tail a)
else False
输出:
Cw2016> la [1,2,2]
False
Cw2016> la [2,2,2]
Program error: pattern match failure: head []
Cw2016> la [2,2,3]
False
Cw2016> la [0,1,3]
False
Cw2016> la [0,0,3]
False
Cw2016> la [0,0,0]
Program error: pattern match failure: head []
Cw2016>
答案 0 :(得分:6)
问题是在第二个分支中,您只知道列表的大小至少为1,但您正在寻找第二个参数。我建议您使用模式匹配替换head和tail(它们是部分函数):
la [] = True
la (x0:x1:xs) =
if (x0 == x1)
then la (x1:xs)
else False
如果您使用-W调用ghc,您将收到警告,指出您的模式不包含x:[]。您可能想要添加此分支:
la (x0:[]) = True
顺便说一下,你应该简化你的表达:
if (x0 == x1)
then la (x1:xs)
else False
为:
(x0 == x1) && la (x1:xs)
为了更好地了解您的问题,a = [x]
对某些x
时会出现问题。首先,head
和tail
定义为:
head (x:xs) = x
head [] = undefined
tail (x:xs) = xs
tail [] = undefined
然后,表达式head (tail a)
的计算结果如下:
head (tail a)
= { value of a }
head (tail (x:[]))
= { first equation of tail }
head []
= { second equation of head }
undefined
这就是你收到错误的原因。