発電機の意味によって異なります。リストは遅れて生成され、それを参照するものは何もないため、消費された部分はほとんど直ちにガベージコレクションされます。上記の計算の結果は増加しないので、計算全体が一定の空間で実行されます。これは標準によって義務付けられているわけではありませんが、その例(および曖昧に似ている)のために異なる空間動作を持つ厳密でないセマンティクスを実装することは難しいので、実際にはそれに頼ることができます。
通常、リストはまだリストとして生成されているため、多くのゴミが生成されています。有利な状況下で、GHCはリスト[1 .. ]
を排除し、非割り当てループ生成する:
result :: [Int]
result = filter odd . filter even $ [1 .. ]
(怠惰のうちプレリュード関数を使用して)、-O2
でコンパイルは、コア
List.result_go =
\ (x_ayH :: GHC.Prim.Int#) ->
case GHC.Prim.remInt# x_ayH 2 of _ {
__DEFAULT ->
case x_ayH of wild_Xa {
__DEFAULT -> List.result_go (GHC.Prim.+# wild_Xa 1);
9223372036854775807 -> GHC.Types.[] @ GHC.Types.Int
};
0 ->
case x_ayH of wild_Xa {
__DEFAULT -> List.result_go (GHC.Prim.+# wild_Xa 1);
9223372036854775807 -> GHC.Types.[] @ GHC.Types.Int
}
}
普通ループを生成します1からmaxBound :: Int
まで実行され、途中で何も生成せず、最後に[]
を生成します。 []
を明白に返すほどスマートです。 GHCは、Int
が偶数である場合、奇数にすることはできないので、チェックは削除され、ブランチには空でないリストが作成されます(つまり、到達不能な枝はコンパイラによって削除されている)。
インタープリタを使用して最適化を確認していますか? – delnan
良い点は、それをコンパイルした、同じことが起こる –
'フィルタは奇妙です。 $ [1 ..] even even filter。 – is7s