F# 序列、列表和数组

F# Sequences, Lists and Arrays

假设我有一个 'a 类型的元素列表,即;

let mylist: 'a list = ...

和类型为 'a -> 'b;

的函数 f
let f: 'a -> 'b = ...

现在我想用fmylist转换成'b array

如下:

mylist |> List.map f |> Array.ofList

通过以下方式在性能和内存方面进行了改进:

mylist |> List.toSeq |> Seq.map f |> Array.ofSeq

?

答案取决于您的 use-case,即 myList 有多大?但是,通常 F# 中的 Seq 速度慢且浪费内存。幸运的是,大多数时候这并不重要,因为我们通常只需要避免 "truly awful performance" 而 "mediocre performance" 通常就足够了。

我还没有测量它(羞耻)但是根据我的经验,在大多数情况下这会比 OP

的例子表现得更好
mylist |> Array.ofList |> Array.map f

尽快从列表转换为数组,然后映射数组(数组用于顺序访问,是 .NET 中更高效的结构之一)。

在一些罕见的情况下,存储中间数组值会导致内存交换到磁盘,我想使用 Seq 可能会有所帮助,但是在这些情况下,为什么我们要使用 List<_>Array<_> 相比是否浪费内存(除非我们可以利用尾重用)?

.NET 中的一些库具有 Seq 类似的属性,但仍提供不错的性能,例如:https://github.com/nessos/Streams

Church-encoded 列表或转换器在避免中间数组值的同时也非常高效。