Haskell - сокращение Eta и расширение Eta

Я изучал функциональную оптимизацию программы и копался в исходниках GHC. Я (в основном) понимаю, что такое сокращение эта и расширение эта. Уменьшение Eta удаляет только избыточные лямбды:

\x -> abs x
=>
abs

Расширение эта противоположно сокращению эта и делает такие вещи (поправьте меня, если я ошибаюсь):

abs
=>
\x -> abs x
-----------------------------------------------
foo = abs
=>
foo x = abs x
-----------------------------------------------
foo = bar 100
bar x y = x + y
=>
foo y = bar 10 y
bar x y = x + y
-----------------------------------------------
etc...

Я не понимаю, как они не мешают друг другу и не отправляют компилятор в бесконечный цикл. Например, сначала значение расширяется, затем уменьшается эта, и так далее. Итак, как две оптимизации не мешают друг другу?

1 ответ

Думаю, я нашел ответ. Я нашел тезис одного из авторов GHC (не помню, как он назывался), и в нем упоминалось, что GHC не выполняет сокращение eta. Вместо этого он выполняет расширение эта и бета-уменьшение (IIRC); Бета-редукция делает большую часть работы.

Другие вопросы по тегам