如何在F#中连接列表(和其他集合)?

23

F#是否提供习惯用法来连接:

  • 序列和列表一起?
  • 将列表和列表一起非破坏性地放入列表中?
  • 如果是破坏性的,可以将列表和列表放在一起成为另一个列表吗?
  • 可变数组在一起,具有破坏性地放入另一个可变数组中?

并且您也可以连接元组吗?


这是很多问题。而且它们中没有一个具体到足以提供有意义的答案...你是否有特定的问题需要解决? - MarcinJuraszek
嗯,我只是想获得专家知识的好处 - 我认为有经验的人应该能够解释这些概念。但我同意这并不适合适当的问答格式。让我缩小范围。 - Tim Lovell-Smith
2个回答

21

将序列和列表合并在一起

没有专门的函数可以实现此操作。如果序列是第一个,而列表是第二个,则必须在将第一个转换为列表(然后使用 List.append 进行附加时进行复制)或者使用 Seq.append 然后跟随 List.ofSeq 进行复制两个列表之间做出选择。

因此编写自己的函数是有道理的。

将列表和列表合并为列表?(非破坏性)

List.append 可以实现这个功能。

如果它是破坏性的,如何将列表和列表合并成一个列表

列表是不可变的,所以没有破坏性附加。

将可变数组彼此破坏性地合并为另一个可变数组?

在.NET中,您无法调整数组大小,因此不存在破坏性的方法。 Array.append 创建一个新数组(会更快,因为它预先知道结果的大小)。

还可以连接元组吗?

不行。类型系统不允许您表达将元组附加到一起的函数的类型(它们必须具有静态已知的大小)。


24
还有一个 @ 运算符,我认为它与 List.append 完全相同。 - YotaXP

16

@运算符是连接多个列表的一种简单而整洁的方法:

let allElements = list1 @ list2 @ list3 @ list4 @ list5 @ list6

4
需要提到的是,@操作符(以及List.append)可能非常慢。因此,如果性能是一个问题,应该避免使用它们,而是通过递归调用cons操作符::将头部从一个列表复制到另一个列表。 - Scott Hutchinson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接