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] = …