.net - 数组值的 Seq 和 Array 之间的区别

标签 .net f#

我是 F# 的新手。

我猜数组仍然是集合,所以我可以使用 Seq像这样迭代数组:

[|"a"; "b"|] |> Seq.map (fun f -> printfn "a") |> ignore;;

但这不起作用 - 它什么也不打印。
另一方面,如果我使用 Array ,它打印字符串:
[|"a"; "b"|] |> Array.map (fun f -> printfn "a") |> ignore;;

这是为什么?

最佳答案

Array.map构建另一个数组 - 这意味着它必须急切地去做。你不能建立一个数组然后说“我会在你需要的时候填写这些值”。

另一方面,序列被懒惰地评估......只有当您要求结果序列中的值时,映射才会被评估。如 Seq.map 的文档中所述:

The given function will be applied as elements are demanded using the MoveNext method on enumerators retrieved from the object.



熟悉LINQ的话,基本就是 Enumerable.Select 的区别(懒惰地产生一个序列)和 Array.ConvertAll (急切地转换一个数组)。

这些都不是迭代数组或序列的方法 - 它们是投影。正如斯金格贝尔所说,Array.iterSeq.iter是合适的迭代函数。

关于.net - 数组值的 Seq 和 Array 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3788711/

相关文章:

c# - 与 .NET 之间的二进制协议(protocol)(C# 语法)

c# - 在 getAsync 中为客户端添加 header (在 using block 中)

c# - 创建一个随机数的排序列表,这些随机数被部分打乱

data-structures - 为什么F#更喜欢列表而不是数组?

wpf - 在 F# WPF MVVM 应用程序中绑定(bind)到 TextBox 的 TextChanged 事件

.net - 在签名文件中共享受歧视的联合

.net - 引用平台特定的System.Data.SQLite

c# - net462 应用程序引用 netstandard1.5 库时出现 "Could not load file or assembly"错误。但为什么?

dictionary - F# 基础 : Map of Maps?

f# - 文字属性不起作用