Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 哈斯克尔:为什么(x:xs)只与一个元素匹配列表?_List_Haskell - Fatal编程技术网

List 哈斯克尔:为什么(x:xs)只与一个元素匹配列表?

List 哈斯克尔:为什么(x:xs)只与一个元素匹配列表?,list,haskell,List,Haskell,给出函数f的定义: f :: [Int] -> [Int] f [] = [] f (x:xs) = x:[] 我会假设一个电话,比如 f [1] 不会匹配,因为模式(x:xs)仅在列表中x之后有更多元素xs时匹配,而列表[1]则不匹配。或者它是?如果你写的是一个包含一个元素的列表[x],这是(x:[])的缩写,或者更详细的(:)x[]。因此,它是一个“cons”((:)),其中x作为元素,空列表作为尾部 因此,函数f(x:xs)确实会将一个列表与一个(或多个)元素相匹配。对于包含一个

给出函数
f
的定义:

f :: [Int] -> [Int]
f [] = []
f (x:xs) = x:[]
我会假设一个电话,比如

f [1]

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

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

因此,函数
f(x:xs)
确实会将一个列表与一个(或多个)元素相匹配。对于包含一个元素的列表,
x
将是元素,
xs
将是空列表

不会匹配,因为模式
(x:xs)
仅在列表中
x
之后有更多元素
xs
时匹配,而列表
[1]
则不匹配

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

如果只想将列表与两个或多个元素进行匹配。您可以将其与以下内容匹配:

-- two or more elements
f (x1 : x2 : xs) = …
或者您可以将其与以下内容匹配:

f [a, b] = …

两者是等价的<代码>[a,b]是一种语法糖:它被编译器替换为
(a:b:[])
,但对于人类来说,在Haskell[1]==1:[]中使用
[a,b]

当然更方便。命令
ghc-fwarn Complete patterns
无法抱怨您的代码。因此发现(x:xs)与[1]匹配。事实上,函数f基本上与
取1
相同。首先,我想知道为什么我的函数定义一开始就编译了,因为函数类型是
[Int]->[Int]
,所以如果我给它一个空列表,那么结果就不是
[Int]
,是吗?第二,我如何匹配一个只有两个元素的列表?[a,b]?@TMOTTM:(a)空列表的类型为
[]
,因此它可以匹配
a~Int
,因此空列表的类型可以是
[Int]
;(b) 你可以将它与
f[a,b]=…
f(a:b:[])=…
匹配,两者都是相同的,因为
[a,b]
只是
(a:b:[])
的语法糖。换句话说,如果你不认为
[]
可以是
[Int]
类型的值,那么它的类型是什么?空列表仍然是一个列表,就像一个没有任何东西的背包一样,它仍然是一个背包
f [a, b] = …