Funcions d’ordre superior habituals en Haskell
Aquesta lliçó recull les funcions d’ordre superior més habituals en Haskell.
flip
Signatura:
flip :: (a -> b -> c) -> (b -> a -> c)
Descripció:
flip f
retorna la funcióf
però amb els seus dos paràmetres invertits. Es defineix perflip f x y = f y x
Exemples:
λ> meitat = flip div 2 λ> meitat 10 👉 5
composició (.)
Signatura:
(.) :: (b -> c) -> (a -> b) -> a -> c
Descripció:
f . g
és la composició de les funcionsf
ig
.Exemples:
λ> majors3 = take 3 . reverse . sort λ> majors3 [3, 1, 2, 6, 7] 👉 [7, 6, 3]
aplicació ($)
Signatura:
($) :: (a -> b) -> a -> b
Descripció:
f $ x
és el mateix quef x
. Sembla inútil, però degut a la baixa prioritat d’aquest operador, ens permet ometre molts parèntesis de tancar!Exemples:
λ> tail (tail (tail (tail "Jordi"))) 👉 "i" λ> tail $ tail $ tail $ tail "Jordi" 👉 "i"
map
Signatura:
map :: (a -> b) -> [a] -> [b]
Descripció:
map f xs
és la llista que s’obté al aplicar la funcióf
a cada element de la llistaxs
, de forma quemap f [x1, x2, ..., xn]
és[f x1, f x2, ..., f xn]
.Exemples:
λ> map even [2, 4, 6, 7] 👉 [True, True, True, False] λ> map (*2) [2, 4, 6, 7] 👉 [4, 8, 12, 14]
filter
Signatura:
filter :: (a -> Bool) -> [a] -> [a]
Descripció:
filter p xs
és la subllista dels elements dexs
que compleixen el predicatp
.
Exemples:
λ> filter even [2, 1, 4, 6, 7] 👉 [2, 4, 6]
zipWith
Signatura:
zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]
Descripció:
zipWith op xs ys
és la llista obtinguda operant cada element dexs
amb cada element deys
via la funcióop
, d’esquerra a dreta, mentre n’hi hagi.Exemples:
λ> zipWith (+) [1, 2, 3] [5, 1, 8, 9] 👉 [6, 3, 11]
all
Signatura:
all :: (a -> Bool) -> [a] -> Bool
Descripció:
all p xs
indica si tots els elements dexs
compleixen el predicatp
.
Exemples:
λ> all even [2, 1, 4, 6, 7] 👉 False λ> all even [2, 4, 6] 👉 True
any
Signatura:
any :: (a -> Bool) -> [a] -> Bool
Descripció:
all p xs
indica si algun dels elements dexs
compleix el predicatp
.
Exemples:
λ> any even [2, 1, 4, 6, 7] 👉 True λ> all odd [2, 4, 6] 👉 False
dropWhile
Signatura:
dropWhile :: (a -> Bool) -> [a] -> [a]
Descripció:
dropWhile p xs
és la subllista dexs
que elimina els primers elements dexs
que compleixen el predicatp
(fins al final o al primer qua no la compleix).
Exemples:
λ> dropWhile even [2, 4, 6, 7, 8] 👉 [7, 8] λ> dropWhile even [2, 4] 👉 []
takeWhile
Signatura:
takeWhile :: (a -> Bool) -> [a] -> [a]
Descripció:
takeWhile p xs
és la subllista dexs
que conté els primers elements dexs
que compleixen el predicatp
(fins al final o al primer que no la compleix).
Exemples:
λ> takeWhile even [2, 4, 6, 7, 8] 👉 [2, 4, 6] λ> takeWhile even [1, 3] 👉 []
iterate
Signatura:
iterate :: (a -> a) -> a -> [a]
Descripció:
iterate f x
retorna la llista infinita[x, f x, f (f x), f (f (f x)), ...]
.
Exemples:
λ> iterate (*2) 1 👉 [1, 2, 4, 8, 16, ...]
foldl
Signatura:
foldl :: (b -> a -> b) -> b -> [a] -> b
Descripció:
foldl ⊕ x0 xs
desplega un operador ⊕ per l’esquerra, de forma quefoldl ⊕ x0 [x1, x2, ..., xn]
és(((x0 ⊕ x1) ⊕ x2) ⊕ ...) ⊕ xn
.Exemples:
λ> foldl (+) 0 [3, 2, (-1)] 👉 4
foldr
Signatura:
foldr :: (a -> b -> b) -> b -> [a] -> b
Descripció:
foldr ⊕ x0 xs
desplega un operador per la dreta, de forma quefoldr ⊕ x0 [x1, x2, ..., xn]
ésx1 ⊕ (x2 ... ⊕ (xn ⊕ x0)))
.Exemples:
λ> foldr (+) 0 [3, 2, (-1)] 👉 4
scanl
Signatura:
scanl :: (b -> a -> b) -> b -> [a] -> [b]
Descripció:
scanl f z xs
és comfoldl f z xs
però enlloc de retornar el valor final, retorna la llista amb tots els resultats intermigs.Exemples:
λ> scanl (+) 0 [3, 2, (-1)] 👉 [0, 3, 5, 4]
scanr
Signatura:
scanr :: (a -> b -> b) -> b -> [a] -> [b]
Descripció:
scanr f z xs
és comfoldr f z xs
però enlloc de retornar el valor final, retorna la llista amb tots els resultats intermigs.Exemples:
λ> scanr (+) 0 [3, 2, (-1)] 👉 [4, 1, -1, 0]
const
Signatura:
const :: a -> b -> a
Descripció:
const x
és una funció que sempre retornax
, independentment de què se li apliqui.Exemples:
λ> map (const 42) [1 .. 5] 👉 [42, 42, 42, 42, 42]
id
Signatura:
id :: a -> a
Descripció:
id
és la funció identitat. També sembla inútil, pero va bé en algun moment.Exemples:
λ> map id [1 .. 5] 👉 [1, 2, 3, 4, 5]
Lliçons.jutge.org
Jordi Petit, Albert Rubio
Universitat Politècnica de Catalunya, 2023
Prohibit copiar. Tots els drets reservats.
No copy allowed. All rights reserved.