[英]how to create a function iterator xs f where xs is a list and f is one-seated function in Haskell
[英]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 1
和x 2
将分别匹配列表的第一项和第二项, xs
是一个包含剩余元素的列表。
编辑:回答您的意见:
我想知道为什么我的 function 定义甚至首先编译,因为 function 类型是
[Int] -> [Int]
,所以如果我给它一个空列表,那么结果不是[Int]
,是吗?
空列表[]
是[a]
类型的数据构造函数之一,因此这意味着[]
具有类型[]:: [a]
。 它可以将类型变量a
与Int
匹配,因此[]
可以具有类型[]:: [Int]
。
其次,如何匹配一个只有两个元素的列表?
[a, b]
?
您可以将此类列表与:
f (a : b : []) = …
或者您可以将其与:
f [a, b] = …
两者是等价的。 [a, b]
是语法糖:它被编译器替换为(a: b: [])
,但是对于人类来说,使用[a, b]
当然更方便。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.