Одна из моих проблем с ленивой оценкой в Haskell - это сложность рассуждений об использовании памяти. Я думаю, что способность дублировать thunk сделает это намного легче для меня. Вот пример.
Создайте действительно большой список:
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 будут представлять одно и то же значение, но также могут быть независимы друг от друга в памяти, поэтому сборщик мусора может освободиться во время сброса памяти, предотвращающей память. (Я думаю, что это немного увеличит вычислительную стоимость?)
Очевидно, что в этом тривиальном примере рефакторинг кода может легко решить эту проблему, но, похоже, не всегда очевидно, как рефакторировать. Или иногда рефакторинг значительно снижает ясность кода.