Haskell Hero

Interaktivní učebnice pro začínající Haskellisty

Eta redukce

Co je eta-redukce?

Eta-redukce je metoda odstranění formálních parametrů funkce.

  • Pokud je úplně napravo levé i pravé strany definice stejný parametr, můžeme jej z definice vynechat.
  • Pokud ne, provedeme úpravu pravé strany tak, aby význam výrazu zůstal nezměněn.

Například funkce

plus x y  =  x + y
se dá vyjádřit bez formálních parametrů takto:

  • Výraz x + y převedeme do prefixu.
    plus x y  =  (+) x y
    
  • Úplně napravo je parametr y, který můžeme ze zápisu vynechat.
    plus x  =  (+) x
    
  • Nyní je úplně napravo i parametr x, který také můžeme vynechat.
    plus  =  (+)
    
    Vyjádřili jsme funkci plus bez formálních parametrů.

Příklad

Vyjádřete následující funkci bez lambda abstrakce:

\x -> 0 < 35 - 3 * 2 ^ x


Nejprve si celý výraz převedeme do prefixu s respektováním priority jednotlivých operátorů.

\x -> (<) 0 ((-) 35 ((*) 3 ((^) 2 x)))
Prefixový zápis binárních funkcí můžeme zapsat jako částečnou aplikaci binární funkce na jeden argument.
\x -> (0<) ((35-) ((3*) ((2^) x)))
Nyní již můžeme začít s převodem výrazu do pointfree. Využijeme k tomu definici tečky
(f . g) x = f (g x)
v opačném směru na argument funkce (35-):
(3*) ((2^) x)
--f- (--g- x)

\x -> (0<) ((35-) (((3*).(2^)) x))
Pokračujeme stejně, jako v předchozím kroku:
(35-) (((3*).(2^)) x)
--f-- (-----g----- x)

\x -> (0<) (((35-).((3*).(2^))) x)
Stejný postup.
(0<) (((35-).((3*).(2^))) x)
--f- (---------g--------- x)

\x -> ((0<).((35-).((3*).(2^)))) x
V tomto bodě je již x úplně napravo, tím pádem můžeme odstranit lambdu.
(0<).((35-).((3*).(2^)))
Jelikož funkce (.) sdružuje zprava, můžeme odstranit závorky určující pořadí vyhodnocení.
(0<).(35-).(3*).(2^)


Barevnou verzi tohoto povídání naleznete v tomto PDF souboru.