Отметьте ассоциативную функцию как строгую в Haskell, чтобы избежать утечек пространства - PullRequest
2 голосов
/ 11 апреля 2019

В течение долгого времени мне было трудно понять, почему «простые» сгибы вызывают утечки в Хаскеле.Эта статья очень полезна, но удивительным образом.

Я кратко процитирую пример foldr, примененного к +, который оценивается следующим образом:

1 + (2 + sum1 [3..n])

Вместо:

(1 + 2) + sum1 [3..n]

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

Это выглядит так, как будто "очевидная" вещь компилятор долженделать, когда известно, что функция строгая и ассоциативная.Должны ли правила переписывания использоваться для этой цели?Это единственный известный мне вариант (кроме переписывания каждого экземпляра вручную).

...