通过递归判断两个列表的长度是否相同



实现判断两个列表长度是否相同的hasSameLength :: [a] -> [b] -> Bool函数。禁止使用length功能

示例:hasSameLength "apple" "peach" == True,hasSameLength "apple" "cherry" == False,hasSameLength [] [1..] == False,hasSameLength [1..] [] == False

到目前为止,我已经尝试了

hasSameLength [] [] = True
hasSameLength [] [a] = False
hasSameLength [a] [] = False
hasSameLength (x:xs) (y:ys) = hasSameLength (xs) (ys)

但是如果只有一个参数列表是空的,我得到一个non-exhaustive patterns错误。执行hasSameLength (x:xs) (y:ys) = hasSameLength (xs) (ys) && hasSameLength (x) (y)导致GHCi由于某种原因在运行时卡住。

hasSameLength [] [] = True
hasSameLength [] _ = False
hasSameLength _ [] = False
hasSameLength (x:xs) (y:ys) = hasSameLength (xs) (ys)

请注意,图案是按从上到下的顺序匹配的。因此,当两个列表都为空时(第一种模式),如果其中一个为空,则它已经是False。我们不关心另一个列表是否有一个或多个元素,我们用下划线_表示。

在你的代码中,你有如下的模式:
hasSameLength [] [a] = False
hasSameLength [a] [] = False

这两行处理一个列表为空而另一个列表只有一个元素的情况。但如果一个是空的,另一个有2个呢?还是很多?这就是你错过的模式,几乎不可能覆盖它,因为下一个模式:

hasSameLength (x:xs) (y:ys) = hasSameLength (xs) (ys)

也没有覆盖它,因为其中一个列表是空的。

一种帮助我思考它的方式是看:[] []作为and的情况下,你需要两个参数都为空(或匹配提供的模式)的模式匹配和_ []和类似的模式,当其中一个是_下划线作为or的情况下,你只需要一个匹配它的工作。

最新更新