首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用警卫递归地计算列表的长度,抛出“函数go中的非穷尽模式”。

使用警卫递归地计算列表的长度,抛出“函数go中的非穷尽模式”。
EN

Stack Overflow用户
提问于 2022-01-15 17:57:21
回答 1查看 96关注 0票数 2

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

在深入研究之后,我注意到这行(x : xs) == [] = res可能有问题,但我不知道到底是什么。任何帮助都将不胜感激!

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

代码语言:javascript
运行
复制
myLength1 list = go list 0
  where
    go [] res = res
    go (x : xs) res = go xs (res + 1)

使用警卫的(抛出Non-exhaustive patterns in function go)

代码语言:javascript
运行
复制
myLength2 list = go list 0
  where
    go (x : xs) res
      | (x : xs) == [] = res
      | otherwise = go xs (res + 1)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-15 17:59:25

,经过一番挖掘,我注意到这行(x:xs) == []可能出了问题

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

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70723958

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档