Functional programming ::和之间的OCaml差异@

Functional programming ::和之间的OCaml差异@,functional-programming,ocaml,Functional Programming,Ocaml,我正在尝试将一个列表附加到另一个列表的末尾。通常的:运算符会给我以下错误: 此表达式具有char list类型 但应为char类型的表达式 在声明中 `(createList 0 5 'a')::['c';'d';'e';'f';'g']` (* the following createList expression returns the list ['a';'a';'a';'a';'a'] *) 当我使用@操作符时,它会附加列表fine;所以,我的问题是@和:之间有什么区别?它只是在两个列

我正在尝试将一个列表附加到另一个列表的末尾。通常的
运算符会给我以下错误:

此表达式具有char list类型 但应为char类型的表达式

在声明中

`(createList 0 5 'a')::['c';'d';'e';'f';'g']`
(* the following createList expression returns the list ['a';'a';'a';'a';'a'] *)

当我使用
@
操作符时,它会附加列表fine;所以,我的问题是
@
之间有什么区别?它只是在两个列表之间使用
@
,而在列表和非列表类型之间使用

@
连接两个列表(类型
'a list->'a list->'a list->'a list->'a list
),而
获取某一类型的元素,并在包含完全相同类型元素的列表之前“预加”它(即
具有类型
'a list->'a list

您基本上可以通过
[a]@b
来模拟
a::b

请注意,
@
要求OCaml遍历给定的第一个列表,以查找第一个列表的最后一个参数。这需要O(n)个时间,其中n是第一个列表中的元素数<代码>:,另一方面,需要O(1)个时间

关于您的示例
(createList 0 5'a')::['c';'d';'e';'f';'g']


(createList 0 5'a')
创建一个包含
'a'
s的列表,即我们有类型
字符列表
,并且
['c';'d';'e';'f';'g']
也是类型
字符列表
。因此,您只能使用
@
来连接它们(参见上文),而
毫无意义(参见上文
的类型签名)。

@
是连接
两个列表

::
是将
元素添加到列表的
标题