【发布时间】:2021-12-08 23:13:24
【问题描述】:
实现判断两个列表是否相同长度的
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 由于某种原因卡在运行时。
【问题讨论】:
-
记得使用
-Wall保持警告开启。这样做会告诉您在模式匹配中错过的情况,例如hasSameLength [] (_:_:_)指出当第一个列表为空而第二个列表至少有两个元素时,匹配将失败。 -
@chi 如何开启
-Wall? -
当您运行 GHC(或 GHCi)时,您可以将其作为参数传递,例如
ghci -Wall MyModule.hs。或者,您可以在文件本身的最顶部添加一行:{-# OPTIONS_GHC -Wall #-}。