每个数字的列表不等于虚假工作,但在相同的数字上它不起作用

时间:2016-11-26 02:46:04

标签: haskell

下面我展示输出。如果它们不相等,我给出一个数字列表然后返回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> 

1 个答案:

答案 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时会出现问题。首先,headtail定义为:

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

这就是你收到错误的原因。