我是 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.iter
和 Seq.iter
是合适的迭代函数。
关于.net - 数组值的 Seq 和 Array 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3788711/