[英]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.