我正在尝试将一个列表附加到另一个列表的末尾。通常的::
运算符给出了以下错误:
此表达式具有char列表类型 但是期望表达式为char
在声明中
`(createList 0 5 'a')::['c';'d';'e';'f';'g']`
(* the following createList expression returns the list ['a';'a';'a';'a';'a'] *)
当我使用@
运算符时,它会将列表附加到正确的位置;那么,我的问题是@
和::
之间有什么区别?只是@
在两个列表之间使用,而::
在列表和非列表类型之间使用?
答案 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