シーケンスとリストの違い
動かしてみてよくわかりました。
シーケンス
let seq1 =
seq { for i in 1..3 do
printfn "generating... %d" i
yield i }let seq2 =
seq1
|> Seq.map (fun x -> printfn "1st map %d" x ; x)
|> Seq.map (fun x -> printfn "2nd map %d" x;x)let seq3 = Seq.map (fun x -> printfn "3rd map %d" x ; x) seq2
let seq4 = Seq.map (fun x -> printfn "4th map %d" x; x) seq3
Seq.iter ignore seq4
出力結果
generating... 1 1st map 1 2nd map 1 3rd map 1 4th map 1 generating... 2 1st map 2 2nd map 2 3rd map 2 4th map 2 generating... 3 1st map 3 2nd map 3 3rd map 3 4th map 3
各要素について生成からmap関数の適用までをひと続きに行い、ある要素を処理し終わってから次の要素を処理しています。実際に処理が出力が行われるのは、この例だと一番最後のSeq.iterを実行したときです。
リスト
let list1 =
[for i in 1..3 do
printfn "generating... %d" i
yield i ]let list2 =
list1
|> List.map (fun x -> printfn "1st map %d" x ; x)
|> List.map (fun x -> printfn "2nd map %d" x;x)let list3 = List.map (fun x -> printfn "3rd map %d" x ; x) list2
let list4 = List.map (fun x -> printfn "4th map %d" x; x) list3
出力結果
generating... 1 generating... 2 generating... 3 1st map 1 1st map 2 1st map 3 2nd map 1 2nd map 2 2nd map 3 3rd map 1 3rd map 2 3rd map 3 4th map 1 4th map 2 4th map 3
全要素について生成し終わった後に、map関数をそれぞれ適用しています。