Haskell Hero
Interaktivní učebnice pro začínající Haskellisty
|
Částečná aplikaceÚvodemV jedné z prvních lekcí jsme si řekli něco o aritě funkce. O tom, že jsou funkce unární, binární, ternární, atd... Zde si ukážeme, jak se dá na aritu nahlížet jinak.
Mějme obecnou ternární funkci
Co se ale stane, když jí dáme jen jeden argument? Z ternární funkce
Co se stane, když dáme binární funkci
A konečně, co se stane, když dáme unární funkci
Pokud tento výraz napíšeme do Hugsu, sám si jej ozávorkuje jako Příklad s (+)
Krabičkové znázornění funkce (+)
Co se stane, když jí dáme pouze jeden argument, například Krabičkové znázornění funkce (5+)
((+) 5) 3 ~> 5 + 3 ~> 8 ((+) 5) 4 ~> 5 + 4 ~> 9 ((+) 5) 6 ~> 5 + 6 ~> 11Funkci ((+) 5) můžeme zapsat infixově jako (5+) . Stejně jako (div 4) můžeme zapsat (4 `div`) .
Jelikož je sčítání komutativní, je nám jedno, jestli napíšeme (2^) 5 ~>* 32 (^2) 5 ~>* 25 Příklad s zipWith
Řekli jsme si, že funkce
Co se stane, když funkci
Co se stane, když funkci
zipWith :: (a -> b -> c) -> [a] -> [b] -> [c] zipWith (++) :: [[a]] -> [[a]] -> [[a]] zipWith (++) [[1,2], [3,4,5]] :: [[Integer]] -> [[Integer]] zipWith (++) [[1,2], [3,4,5]] [[10,11,12], [13,14]] :: [[Integer]]Poslední výraz se vyhodnotí následovně: zipWith (++) [[1,2], [3,4,5]] [[10,11,12], [13,14]] ~>* [[1,2] ++ [10,11,12], [3,4,5] ++ [13,14]] ~>* [ [1,2,10,11,12] , [3,4,5,13,14] ] |