haskell - 解释这个haskell函数“要列出的元组列表”
问题描述
我是初学者,基本上我需要对此进行解释
他用这段代码回答:
tupleToList :: [(a,a)] -> [a]
tupleToList ((a,b):xs) = a : b : tupleToList xs
tupleToList _ = []
但我不明白他为什么不使用:
tupleToList [] = []
tupleToList ((a,b):xs) = a : b : tupleToList xs
就像我通常在指南的第一个练习中看到的那样。我知道'_'是什么,但是,当列表为空时,使用'[]'不是更好吗?
解决方案
就像我通常在指南的第一个练习中看到的那样。我知道那是什么,但是,当列表为空时,
_
使用这个意思不是更好吗?[]
语义上两者是相同的,因为 2 元组只有一个构造函数(a,b)
,而列表有两个构造函数[]
和(h:t)
。
由于第一个子句不匹配的唯一模式是空列表,因此通配符 _
等效于[]
.
由于[]
和((a,b):xs)
是分离模式(即没有可以匹配两种模式的值),当[]
显式使用时,两种模式的顺序并不重要。那么,我们可以按照我们喜欢的任何顺序编写它。
一些 Haskell 程序员更喜欢使用显式模式(所以用 with[]
而不是_
),因为这意味着我们知道我们用那个子句实际处理了哪些值。如果稍后 Haskell 社区决定引入一个额外的列表构造函数(是的,对于不太可能的列表,但对于其他data
类型,这可能更合理),Haskell 编译器可以 (with -Wincomplete-patterns
) 发出警告,指出某些模式没有被覆盖。通配符当然涵盖了所有模式,但右边的表达式可能不是我们打算用于附加构造函数的表达式。
因此,我建议仅在您想通过同一子句匹配多个模式时才使用通配符。如果很清楚其他模式是什么,最好是明确的。就像Python 之禅所说(是的,它是 Python,但大多数概念在某种程度上是通用的):“显式优于隐式”。
推荐阅读
- python - 如何编写一个函数,仅计算类数组对象的前 n 项并返回它们的总和?
- r - RcppTN .cpp 脚本在来源时有效,但在库中编译时无效
- android - RecyclerView item element(imageview)click
- javascript - 如何在 swiper 滑块“.swiper-wrapper”类上添加固定的过渡持续时间值?
- rest - REST API 设计:当 api 必须返回一个字段的相等和不相等列表时,如何处理这种情况?
- c# - 尝试在锚标记助手中使用自定义路由时出错
- r - 如何在 RMarkdown 中合并和打印多个代码块?
- c++ - 在 C++ 中将变量 wstring 分配给 Char 数组
- prometheus - 在普罗米修斯的一项工作中注册多个黑盒出口商
- ansible - 如何在ansible中以不同的参数方式应用条件