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)
经过一番挖掘后,我注意到这条线可能有问题
(x:xs) == []
(x:xs) == []永远不可能成功。您构造一个至少(x:xs)包含一个元素的列表:是第一个元素,并且是剩余元素的(可能为空)列表,而是一个空列表。xxs[]
如果您这样调用go [],它将无法进行模式匹配(x:xs),因为空列表的数据构造函数是,而“ cons[] ”的数据构造函数是。因此,这确实会引发非穷举模式错误。(:)