[英]Difference between Seq and Array for array value
我是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
的文档中Seq.map
:
在从对象检索的枚举数中使用MoveNext方法需要元素时,将应用给定的函数。
如果您熟悉LINQ,那么它基本上就是Enumerable.Select
(懒洋洋地生成序列)和Array.ConvertAll
(急切地投射数组)之间的区别。
这些都不是迭代数组或序列的方式 - 它们是预测 。 正如Stringer Bell所说, Array.iter
和Seq.iter
是迭代的合适函数。
如果你想迭代你的集合,你必须使用Seq.iter
,就像那样:
[|"a"; "b"|] |> Seq.iter (fun f -> printfn "%A" f);;
如果只迭代数组,你也可以使用Array.iter
:
[|"a"; "b"|] |> Array.iter (fun f -> printfn "%A" f);;
另一个(和更短的)替代方案是直接将您的值输入printfn "%A"
函数:
[|"a"; "b"|] |> printfn "%A";;
将打印[|"a"; "b"|]
[|"a"; "b"|]
。 请注意,在这种情况下,F#打印它就像您编写它一样。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.