使用守卫递归计算列表的长度会抛出“函数 go 中的非详尽模式”

and*_*kin 2 recursion haskell functional-programming

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

经过一番挖掘后,我注意到这条线可能有问题(x : xs) == [] = res,但我不知道到底是什么。任何帮助将非常感激!

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

myLength1 list = go list 0
  where
    go [] res = res
    go (x : xs) res = go xs (res + 1)
Run Code Online (Sandbox Code Playgroud)

使用守卫(投掷Non-exhaustive patterns in function go

myLength2 list = go list 0
  where
    go (x : xs) res
      | (x : xs) == [] = res
      | otherwise = go xs (res + 1)
Run Code Online (Sandbox Code Playgroud)

Wil*_*sem 6

经过一番挖掘后,我注意到这条线可能有问题(x:xs) == []

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

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