实现判断两个列表长度是否相同的
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
的情况下,你只需要一个匹配它的工作。