使用 guards throws "Non-exhaustive patterns in function go" 递归计算列表的长度

Calculating length of the list recursively using guards throws "Non-exhaustive patterns in function go"

我正在尝试使用不同的方法计算列表的长度(只是为了熟悉该语言)。使用模式匹配的函数按预期工作,而使用守卫的函数会抛出错误。

经过一些挖掘,我注意到这一行可能有问题 (x : xs) == [] = res,但我无法弄清楚到底是什么。任何帮助将不胜感激!

使用模式匹配(按预期工作)

myLength1 list = go list 0
  where
    go [] res = res
    go (x : xs) res = go xs (res + 1)

使用守卫(抛出Non-exhaustive patterns in function go

myLength2 list = go list 0
  where
    go (x : xs) res
      | (x : xs) == [] = res
      | otherwise = go xs (res + 1)

After some digging I noticed that something is probably wrong with this line (x:xs) == []

(x:xs) == []永远不可能成功。使用 (x:xs) 构建一个包含 至少 一个元素的列表:x 是第一个元素,xs 是一个(可能为空的)列表剩余元素,而 [] 是一个空列表。

如果你这样调用go [],它将无法与(x:xs)进行模式匹配,因为空列表的数据构造函数是[],而“ cons”是 (:)。因此,这确实会引发非详尽的模式错误。