GHCは、「半並列」のリストに対して複数の操作を実行するのに十分インテリジェントですか?
この(簡略化された)コードを考えてみましょう。
findElements bigList = do
let special = head . filter isSpecial $ bigList
let others = filter isSpecialOrNormal $ bigList
return (special, others)
(元のコードによるモナド)
GHCは最初のリスト操作を実行し、2番目の操作がそれらを処理できるように、すべての要素をメモリに保持すると思います。
私の問題は、大きなファイルを処理するときにスペースリークが発生していることです。しかし、私はそれが一定の空間で実行できるはずだと信じています。これを達成する方法はありますか?
アップデート1
このように書き留めておけば、もちろんこの問題の解決策は2行の順序を変更することです。
しかし、私の質問は残っています。GHCは、モナドで実行されていない場合に、この半並列処理を理解するのに十分インテリジェントですか?