В течение долгого времени мне было трудно понять, почему «простые» сгибы вызывают утечки в Хаскеле.Эта статья очень полезна, но удивительным образом.
Я кратко процитирую пример foldr
, примененного к +
, который оценивается следующим образом:
1 + (2 + sum1 [3..n])
Вместо:
(1 + 2) + sum1 [3..n]
Как следует из комментария, даже этого недостаточно, чтобы работать в постоянном пространстве.
Это выглядит так, как будто "очевидная" вещь компилятор долженделать, когда известно, что функция строгая и ассоциативная.Должны ли правила переписывания использоваться для этой цели?Это единственный известный мне вариант (кроме переписывания каждого экземпляра вручную).