列表构造/连接的语法

Col*_*ury 15 syntax haskell list

我现在只在Haskell工作了两天,并想知道下面两个函数定义之间的区别是:

Prelude> let swap (x1:x2:xs) = x2:x1:xs
Prelude> swap [1..5]
[2,1,3,4,5]
Prelude> let swap' (x1:x2:xs) = [x2] ++ [x1] ++ xs
Prelude> swap' [1..5]
[2,1,3,4,5]
Run Code Online (Sandbox Code Playgroud)

也就是说,是什么让x2:x1:xs与[x2] ++ [x1] ++ xs不同?拜托,谢谢.

Jef*_*ter 34

类型签名是一个很好的起点:

(:) :: a -> [a] -> [a]
(++) :: [a] -> [a] -> [a]
Run Code Online (Sandbox Code Playgroud)

你可以找到这些出来:type (:),并:type (++)在ghci中.

从类型签名中可以看出,两者都用于生成列表.

:运算符用于构造列表(以及再次分开把它们用于模式匹配).要制作一个列表,[1,2,3]你只需要构建它1 : 2 : 3 : [].第一个元素:是要添加到列表前面的项目,第二个元素是列表(也是用它构建的,:或者用表示的空列表[]).

++运营商连接列表.它需要两个列表并将它们一起添加. [1,2,3] ++ [4,5,6]是合法的,而1 ++ [1,2,3]不是.


Ing*_*ngo 5

这与语法无关。(:)和(++)只是不同的运算符。(:)是一个构造函数,它从一个元素和另一个列表构造一个列表。(++)创建一个新列表,该列表是两个列表的串联。因为(++)不是构造函数,所以不能在模式中使用它。

现在我们来谈谈语法:符号

[x2]
Run Code Online (Sandbox Code Playgroud)

您使用的是

x2:[]
Run Code Online (Sandbox Code Playgroud)

因此,您在第二个示例中所做的实际上是:

(x2:[]) ++ (x1:[]) ++ xs
Run Code Online (Sandbox Code Playgroud)

因此,构造列表时,您无法避免(:),这是最终的唯一方法。请注意,必须构造中间列表才能使用(++)。