::和@之间的OCaml差异

时间:2014-02-05 10:49:43

标签: functional-programming ocaml

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

  

此表达式具有char列表类型   但是期望表达式为char

在声明中

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

当我使用@运算符时,它会将列表附加到正确的位置;那么,我的问题是@::之间有什么区别?只是@在两个列表之间使用,而::在列表和非列表类型之间使用?

2 个答案:

答案 0 :(得分:1)

@连接两个列表(类型'a list -> 'a list -> 'a list),而::采用某种类型的元素,并在包含完全相同类型的元素的列表之前“预先”它(即::的类型为'a -> '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'的列表,即我们的类型为char list,而['c';'d';'e';'f';'g']的类型也为char list。因此,您只能使用@连接它们(参见上文),::没有意义(请参阅上面::的类型签名)。

答案 1 :(得分:0)

@是连接two lists

::是将an element添加到head of a list