使用 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”是 (:)
。因此,这确实会引发非详尽的模式错误。
我正在尝试使用不同的方法计算列表的长度(只是为了熟悉该语言)。使用模式匹配的函数按预期工作,而使用守卫的函数会抛出错误。
经过一些挖掘,我注意到这一行可能有问题 (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”是 (:)
。因此,这确实会引发非详尽的模式错误。