Elementarne kroky pouzitelne pri prevode vyrazu z pointwise do pointfree tvaru Kazdy z tychto krokov posunie x vo cely vyraz o nieco blizsie k stavu, ked je mozne odstranit premennu. Cielom je dostat vyraz do tvaru \... x -> f x, pricom ma byt zaroven ekvivalenty s tvarom \... x -> (f) x. Potom je mozne urobit eta redukciu na f. Popis skratiek: vyraz - vyraz neobsahujuci premennu x vyraz_x - vyraz obsahujuci premennu x param - parameter .op. - operator [a\b]c - nahrad vyskyty vyrazu b vo vyraze c vyrazom a --- A (operator, x vpravo) \x -> vyraz1 .op. vyraz2_x \x -> ((.op.) vyraz1) (vyraz2_x) pr: \x -> flip . const x \x -> ((.) flip) (const x) --- B (operator, x vlavo) \x -> vyraz1_x .op. vyraz2 \x -> (flip (.op.) (vyraz2)) (vyraz1_x) pr: \a -> even x || any [True, False] \a -> (flip (.) (any [True, False])) (even x) --- C (zlozena funkcia) \x -> vyraz1 (vyraz2 x) vyraz1 . vyraz2 pr: \f -> id (flip f) id . flip --- D (x zahrabane vnutri medzi parametrami funkcie) \x -> vyraz1 vyraz2_x param1 ... paramn \x -> (flip vyraz1 param1) vyraz2_x param2 ... paramn pr: \x -> take x [(1+), (2*)] 10 \x -> (flip take [(1+), (2*)]) x 10 --- E (x uplne vlavo vo funkcii) \x -> vyraz1_x param1 ... paramn 1. \x -> (($) paramn) (vyraz1_x param1 ... param(n-1)) 2. - previest vyraz1_x na vyraz vyraz2_x a pouzit D (je mozne pouzit lubovolnu z tychto moznosti, podla toho, ktora ide skor) pr: \f -> f 1 10 \f -> (($) 10) (f 1) \m n -> (^(n + 1)) (m - 1) \m n -> (^) (m - 1) (n + 1) --- F (let konstrukcia) \x -> let f = vyraz in vyraz_x_f \x -> [(vyraz)\f]vyraz_x_f pr: \a x -> let px = 2 ^ x in px + div px 4 - a \a x -> [(2 ^ x)\px]px + div px 4 - a \a x -> 2 ^ x + div (2 ^ x) 4 - a