list - Haskell:为什么 (x:xs) 只匹配一个元素的列表?
问题描述
给定函数的这个定义f
:
f :: [Int] -> [Int]
f [] = []
f (x:xs) = x:[]
我会假设一个电话,如
f [1]
不会匹配,因为模式只匹配,如果列表中的后面(x:xs)
有更多元素,而列表不是这种情况。或者是吗?xs
x
[1]
解决方案
如果你写[x]
一个包含一个元素的列表,这是 的缩写(x : [])
,甚至更详细(:) x []
。所以它是一个(:)
带有 as 元素的“cons”()x
,而空列表作为尾部。
所以你的函数f (x:xs)
确实会匹配一个包含一个(或多个)元素的列表。对于具有一个元素的列表,x
将是元素和xs
一个空列表。
不会匹配,因为模式只匹配,如果列表中的后面
(x:xs)
有更多元素,而列表不是这种情况。xs
x
[1]
不(x:xs)
匹配每个非空列表、列表x
的第一个元素以及xs
剩余元素的(可能为空的)列表。
如果您只想匹配包含两个或多个元素的列表。您可以将其与:
-- two or more elements
f (x1 : x2 : xs) = …
这里and将分别匹配列表的第一项和第二项,并且是一个包含剩余元素的列表。x1
x2
xs
编辑:回答您的意见:
我想知道为什么我的函数定义首先会编译,因为函数类型是
[Int] -> [Int]
,所以如果我给它一个空列表,那不是[Int]
结果,是吗?
空列表[]
是该[a]
类型的数据构造函数之一,这意味着它[]
具有 type [] :: [a]
。它可以将类型变量a
与匹配Int
,因此[]
可以具有类型[] :: [Int]
。
其次,如何匹配一个只有两个元素的列表?
[a, b]
?
您可以将此类列表与:
f (a : b : []) = …
或者您可以将其与:
f [a, b] = …
两者是等价的。[a, b]
是语法糖:它被编译器替换为(a : b : [])
,但是对于人类来说,使用它当然更方便[a, b]
。
推荐阅读
- typescript - 使用 Typescript 的通用映射器
- python - 用逗号打印所有 False 参数
- python - 如何计算文本中特定句子的出现次数?
- amazon-web-services - 即时切换 Dynamodb 区域
- angular - NGXS - 如何打包一个动作以便可以远程调度它
- java - 单击 android 小部件上的 imagebutton 后显示一个简单的吐司
- javascript - JavaScript 减少和解构问题
- javascript - React props.children 在第一次状态更改后不会重新渲染
- python - 从多个 .py 和 .svg 文件创建一个 EXE 文件
- reactjs - 将表单输入的值传递给 React 中的兄弟组件