簡體   English   中英

數組值的Seq和Array之間的差異

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM