我是F#的新手.
我猜数组仍然是集合,所以我可以Seq像这样迭代数组:
[|"a"; "b"|] |> Seq.map (fun f -> printfn "a") |> ignore;;
Run Code Online (Sandbox Code Playgroud)
但这不起作用 - 它什么都不打印.另一方面,如果我使用Array,它会打印字符串:
[|"a"; "b"|] |> Array.map (fun f -> printfn "a") |> ignore;;
Run Code Online (Sandbox Code Playgroud)
这是为什么?
Array.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);;
Run Code Online (Sandbox Code Playgroud)
Array.iter如果只是在数组上迭代,你也可以使用它:
[|"a"; "b"|] |> Array.iter (fun f -> printfn "%A" f);;
Run Code Online (Sandbox Code Playgroud)
另一个(和更短的)替代方案是将您的价值直接输入printfn "%A"功能:
[|"a"; "b"|] |> printfn "%A";;
Run Code Online (Sandbox Code Playgroud)
将打印[|"a"; "b"|].请注意,在这种情况下,F#打印它就像您编写它一样.
| 归档时间: |
|
| 查看次数: |
642 次 |
| 最近记录: |