Можно ли продублировать преобразователь для повышения производительности памяти?

Одна из моих проблем с ленивой оценкой в Haskell - это сложность рассуждений об использовании памяти. Я думаю, что способность дублировать громоотвод сделает это намного проще для меня. Вот пример.

Давайте создадим действительно большой список:

let xs = [1..10000000]

Теперь давайте создадим плохую функцию:

bad = do
    print $ foldl1' (+) xs
    print $ length xs

Без оптимизации это израсходует несколько десятков МБ ОЗУ. Сборщик мусора не может освобождать xs во время сгиба, потому что он понадобится для вычисления длины позже.

Можно ли переопределить эту функцию примерно так:

good = do
    (xs1,xs2) <- copyThunk xs
    print $ foldl1' (+) xs1
    print $ length xs2

Теперь xs1 и xs2 будут представлять одно и то же значение, но также не будут зависеть друг от друга в памяти, чтобы сборщик мусора мог освобождаться во время свертывания, предотвращая потерю памяти. (Я думаю, что это немного увеличит вычислительные затраты?)

Очевидно, что в этом тривиальном примере рефакторинг кода может легко решить эту проблему, но кажется, что не всегда очевидно, как выполнить рефакторинг. Или иногда рефакторинг может значительно снизить ясность кода.

Ответы на вопрос(3)

Ваш ответ на вопрос