考虑给定列表[3;4;5]
。
现在,我要执行x::[3;4;5];;
在OCaml中是否有x
会再次导致结果[3;4;5]
?
答案 0 :(得分:7)
不,x::xs
的结果将始终是一个列表,其元素比xs
多。
如果您想有条件地将元素放在列表的前面,则必须执行if condition then x::xs else xs
。也就是说,仅当您确实有要添加的元素时才使用::
。
答案 1 :(得分:4)
其他答案也都是正确的,但是我认为看看list
的定义可能会有所帮助。
内幕之下,list
大致如下:
type 'a list =
| []
| ( :: ) of 'a * 'a list
这意味着两件事:
( :: )
始终将元素添加到现有列表的前面。因此,如果您已经有一个列表[3; 4; 5]
,那么x
必须是int
才能编译x :: [3; 4; 5]
。
答案 2 :(得分:1)
不,它们永远不能相等-第一个是长度为3的列表,另一个是长度为4的列表。
答案 3 :(得分:1)
不,::
总是创建一个新列表,该列表长一个元素。
您可能要寻找的是@
,它将一个列表追加到另一个列表(实际上,它在第二个列表之前先列出了第一个列表)。为此,您拥有[] @ list ==> list
。