繁体   English   中英

Haskell:为什么 (x:xs) 只匹配一个元素的列表?

[英]Haskell: Why does (x:xs) match the list with only one element?

鉴于 function f的定义:

f :: [Int] -> [Int]
f [] = []
f (x:xs) = x:[]

我会假设一个电话,如

f [1]

将不匹配,因为模式(x:xs)仅在列表中x之后有更多元素xs时匹配,而列表[1]则不是这种情况。 或者是吗?

如果你写[x] ,一个包含一个元素的列表,这是(x: [])的缩写,或者更详细的(:) x [] 所以它是一个“缺点”( (:) ),其中x为元素,空列表为尾。

因此,您的 function f (x:xs)确实会匹配具有一个(或多个)元素的列表。 对于具有一个元素的列表, x将是元素,而xs将是一个空列表。

将不匹配,因为模式(x:xs)仅在列表中x之后有更多元素xs时匹配,而列表[1]则不是这种情况。

不, (x:xs)与每个非空列表匹配,其中x是列表的第一个元素,而xs是剩余元素的(可能为空)列表。

如果您只想匹配包含两个或多个元素的列表。 您可以将其与:

-- two or more elements
f (x1 : x2 : xs) = …

这里x 1x 2将分别匹配列表的第一项和第二项, xs是一个包含剩余元素的列表。

编辑:回答您的意见

我想知道为什么我的 function 定义甚至首先编译,因为 function 类型是[Int] -> [Int] ,所以如果我给它一个空列表,那么结果不是[Int] ,是吗?

空列表[][a]类型的数据构造函数之一,因此这意味着[]具有类型[]:: [a] 它可以将类型变量aInt匹配,因此[]可以具有类型[]:: [Int]

其次,如何匹配一个只有两个元素的列表? [a, b] ?

您可以将此类列表与:

f (a : b : []) = …

或者您可以将其与:

f [a, b] = …

两者是等价的。 [a, b]语法糖:它被编译器替换为(a: b: []) ,但是对于人类来说,使用[a, b]当然更方便。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM