Haskell Hero
Interaktivní učebnice pro začínající Haskellisty
|
Lambda abstrakceProč výrazy s lambdou?Příklad
Definujte funkci zvetsiSeznam [1,2,5] ~>* [1*2+5, 2*2+5, 5*2+5] ~>* [7,9,15]
Nejjednodušší bude použít funkci zvetsi :: Integer -> Integer zvetsi x = x*2+5Následně můžeme definovat i námi požadovanou funkci: zvetsiSeznam :: [Integer] -> [Integer] zvetsiSeznam s = map zvetsi sA jsme hotovi. Pokud bychom ale funkci zvetsi k ničemu jinému nepotřebovali, je její definování tímto způsobem docela zbytečné. Můžeme totiž použít tzv. anonymní funkce.
Výrazy s lambdouVýrazy s lambdou nejvíce oceníme v situacích, kdy potřebujeme rychle definovat funkci, kterou použijeme pouze na jednom místě. Například funkce, která zdvojnásobuje svůj argument, může vypadat následovně: \x -> 2 * xToto je anonymní unární funkce, do které vhodíme číslo a vypadne z ní jeho dvojnásobek. Aneb "Vezmi x a udělej z něj 2 * x ."
Binární funkce, do které hodíme dvě čísla a ona nám je sečte, může vypadat například takto: \x y -> x + yAneb "Vezmi x a y a udělej z nich x + y ."
Příklady vyhodnocení: (\x -> 2 * x) 5 ~> 2 * 5 ~> 10 (\x y -> x + y) 3 5 ~> 3 + 5 ~> 8 Funkci z předchozího odstavce můžeme tedy definovat pomocí anonymní funkce takto: zvetsiSeznam :: [Integer] -> [Integer] zvetsiSeznam s = map (\x -> x*2+5) s
Pomocí lambdy můžeme i jiným zápisem definovat funkce curry g = \x y -> g (x,y) uncurry f = \(x,y) -> f x yZ tohoto zápisu je i lépe vidět častý způsob použití těchto dvou funkcí. Například můžeme zadefinovat funkci fst pomocí funkce const a naopak.
fst = uncurry const const = curry fst |