У GHC есть много оптимизаций, которые он может выполнять, но я не знаю, что это все, и насколько они вероятны, и при каких обстоятельствах.
Мой вопрос: какие преобразования я могу ожидать, что он будет применяться каждый раз, или почти так? Если я посмотрю на фрагмент кода, который будет выполняться (оцениваться) часто, и моя первая мысль "хм, может быть, я должен это оптимизировать", в каких случаях должна быть моя вторая мысль: "Даже не думай об этом, GHC получил это??
Я читал статью Stream Fusion: от списков до потоков до ничего вообще и метод, используемый для обработки переписывающих списков в другая форма, которую нормальная оптимизация GHC надежно оптимизировала бы до простых циклов, была для меня новой. Как я могу сказать, когда мои собственные программы имеют право на такую оптимизацию?
Там некоторая информация в руководстве GHC, но это лишь часть пути ответа на вопрос.
EDIT: Я начинаю щедрость. Я бы хотел, чтобы список преобразований более низкого уровня, таких как lambda/let/case-floating, спецификация аргументов типа/конструктора/функции, анализ строгости и распаковки, рабочий/обертка и все остальное значимое GHC, которое я забыл, наряду с пояснениями и примерами кода ввода и вывода и идеально иллюстрирует ситуации, когда общий эффект больше, чем сумма его частей. И в идеале, некоторые упоминания о том, когда трансформаций не произойдет. Я не ожидаю объяснений новой длины для каждой трансформации, может быть достаточно нескольких предложений и примеров внутристрочного кода с одним слоем (или ссылки, если это не двадцать страниц научной статьи), если общая картина ясно до конца. Я хочу, чтобы иметь возможность взглянуть на кусок кода и быть в состоянии дать хорошее представление о том, будет ли он скомпилирован до жесткой петли, или почему бы нет, или что я должен был бы изменить, чтобы сделать это. (Мне неинтересно так много здесь, в больших оптимизационных средах, таких как stream fusion (я только что прочитал статью об этом), больше в том знании, которое люди, пишущие эти рамки, имеют.)