Studiowałem funkcjonalną optymalizację programu i wykopalizowałem w źródle GHC. I (głównie) zrozumieć, jakie są redukcja ETA i ekspansja ETA. Redukcja ETA usuwa tylko redundantne lambdas:

\x -> abs x
=>
abs

ETA Expansion jest przeciwieństwem redukcji ETA i robi takie rzeczy (popraw mnie, jeśli jestem niepoprawny):

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...

To, czego nie dostaję, to w jaki sposób nie dostają się do siebie i wysyłają kompilatora w nieskończoną pętlę. Na przykład, pierwsza, wartość jest ETA rozszerzona, a następnie jest zredukowana ETA i tak dalej. Jak więc dwie optymalizacje nie dostają się do siebie?

1
xilpex 23 październik 2020, 05:05

1 odpowiedź

Najlepsza odpowiedź

Myślę, że znalazłem odpowiedź. Znalazłem tezę z udziału w GHC (nie pamiętam, co się nazywa), iw nim wspomniał, że GHC nie robi redukcji ETA. Zamiast tego robi ekspansję ETA i redukcja beta (IIRC); Redukcja beta robi większość zadania.

0
xilpex 30 październik 2020, 00:30