Позволит ли конструкция что-то оптимизировать в понимании списка? - PullRequest
0 голосов
/ 24 февраля 2019

Я должен написать функцию, которая суммирует элементы в блоке понимания списка.

Давайте возьмем эти две функции только для примера:

letSum :: [Int] -> [Int]
letSum xs = [result | x <- xs, y <- xs, let result = x + y, result > 10]

normalSum  :: [Int] -> [Int]
normalSum xs = [x + y | x <- xs, y <- xs, x + y > 10]

Вопрос:

  • Является ли вторая функция суммирующей x и y дваждыв отличие от первого?
  • Если нет, то как это работает?

1 Ответ

0 голосов
/ 24 февраля 2019

Вторая функция будет вычислять сумму дважды - здесь не требуется явное совместное использование, а Haskell не выполняет запоминание (источник: Когда автоматическое запоминание в GHC Haskell? )

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


РЕДАКТИРОВАТЬ:

Кто-то вв комментариях упоминается CSE (исключение общих подвыражений) как возможная оптимизация, которая может произойти здесьЯ попытался скомпилировать вашу функцию с помощью -ddump-cse, чтобы выяснить, произойдет ли это, но хотя я не нашел упоминаний о normalSum, вывод был слишком загадочным для меня.Однако мой ответ должен быть верным, если вы строите свою функцию без флага -O*.Я обновлю свой ответ, если найду больше информации об этом.

...