Как я могу получить самые умные оптимизации, которые делает GHC?

Потому что я вижу, что это происходит: это другой вопрос, чем Какие оптимизации можно ожидать от GHC для надежной работы?, потому что я не прошу самых надежных оптимизация, просто самая умная/мощная.

Я специально ищу неинтуитивную оптимизацию, которую GHC делает, что может иметь серьезные последствия для производительности и демонстрировать мощь оптимизации компилятора, связанную с ленивой оценкой или чистотой. И прямые объяснения о том, как добраться до них.

Лучшие ответы будут иметь:

  • Объяснение оптимизации и почему она настолько умна или мощна.
  • Почему оптимизация повышает производительность.
  • Как GHC распознает, когда он может использовать эту оптимизацию
  • Что оптимизация фактически преобразует код в
  • Почему эта оптимизация требует ленивой оценки или чистоты.

Ответы

Ответ 1

Слияние потоков, вероятно, самое большое. Он превращается в нечто вроде sum . map (+1) . filter (>5), которое номинально выделяет два новых списка, в простой цикл, который работает в постоянном пространстве.