list - `('a':_)` 代表一个元组还是一个列表?
问题描述
决定列表是否以字母“a”开头的函数可以定义如下:
test :: [Char] -> Bool
test ['a',_] = True
test _ = False
或者
test :: [Char] -> Bool
test ('a':_) = True
test _ = False
为什么第一次用[]
,而第二次用()
?
第二个用于('a':_)
表示元组还是列表?
- 如果是元组,
test
的参数不是列表类型[Char]
吗? - 如果一个列表,不代表
()
一个元组,它怎么能代表一个列表?
解决方案
第二个用于
('a':_)
表示元组还是列表?
一份清单。
如果一个列表,不代表
()
一个元组,它怎么能代表一个列表?
不,这是单位类型[wiki]。它不是元组,也不是列表。有时,正如维基百科文章所说,它被解释为 0 元组。它也被定义GHC.Tuple
。
为什么第一次用
[]
,而第二次用()
?
两者不等价。前者匹配一个只有两个元素的列表,其中第一个元素是 an 'a'
,而后者匹配一个具有至少一个元素的列表,其中第一个元素是 an 'a'
。但是后者可以匹配一个包含一个元素、三个元素等的列表,而前者只能匹配恰好包含两个元素的列表。
背景
(:)
是列表的数据构造函数。的确:
Prelude> :i (:)
data [] a = ... | a : [a] -- Defined in ‘GHC.Types’
infixr 5 :
('a': _)
只是 的一种更好的形式((:) 'a' _)
。因此,我们在这里使用列表数据构造函数之一。
是的['a', _]
语法糖(:) 'a' ((:) _ [])
,所以这里我们匹配一个以 an 开头的列表,'a'
其中尾部是一个列表,头部是我们不关心的值,尾部是空列表数据构造函数。
推荐阅读
- performance - SPARK mapToPair 和 saveToTextFile 我应该使用重新分区来优化性能吗
- firebase - 使用 Firebase 云功能的 Expo 推送通知
- sql - 在最近 3 个月的交易中,哪个产品类别的退货价值最高
- angular - Angular 电子邮件验证模式以严格执行该模式
- xstate - 无法为 xstate 创建子状态
- java - 尝试在空对象引用上调用虚拟方法“java.lang.String java.lang.String.toUpperCase()”
- excel - 工作簿中的 VBA ADO 连接到同一工作簿
- performance - Go Web 应用程序是否应该在一个模板中包含所有页面?
- vba - 使用 VBA 的矩阵乘法
- python - Python/Windows 10 - 有没有办法防止 Windows 10 计算机在 Python 中进入睡眠状态?