|
Funciones aplicadas a listas III
takeWhile
takeWhile es una función binaria que toma como parámetros:
- una función condicional
p que hace Bool de cualquier cosa, de tipo a -> Bool
- una lista de cualquier cosa hace que la función
p pueda tomar como parámetro, de tipo [a]
La expresión takeWhile p s se evalúa al principio de la lista s en el que todos los elementos cumplen la condición p .
Definición
takeWhile :: (a -> Bool) -> [a] -> [a]
takeWhile _ [] = []
takeWhile p (x:s) = if p x then x : takeWhile p s
else []
Ejemplos
takeWhile (<5) [1,2,6,7,3,4] ~>* [1,2]
takeWhile even [2,4,6,5,7,8] ~>* [2,4,6]
takeWhile id [False,True,True] ~>* []
dropWhile
dropWhile es una función binaria que igual que la función takeWhile toma parámetros siguientes:
- una función condicional
p que hace Bool de cualquier cosa, de tipo a -> Bool
- una lista de cualquier cosa hace que la función
p pueda tomar como parámetro, de tipo [a]
La expresión dropWhile p s se evalúa de manera siguiente: Tira todos los elementos del principio que cumplen la condición p y devuelve el resto de la lista.
Definición
dropWhile :: (a -> Bool) -> [a] -> [a]
dropWhile _ [] = []
dropWhile p (x:s) = if p x then dropWhile p s
else (x:s)
Ejemplos
dropWhile (<5) [1,2,6,7,3,4] ~>* [6,7,3,4]
dropWhile even [2,4,6,9,8,7] ~>* [9,8,7]
dropWhile id [True, False, False] ~>* [False,False]
zip
zip es una función binaria que toma como parámetros dos listas de cualquier cosa, s y t , y de ellas hace una lista de duplas (x,y) en las que x es de la lista s y y es de lista t . La lista final tiene tantos elementos como la lista más corta de las listas s y t .
Definición
zip :: [a] -> [b] -> [(a,b)]
zip [] _ = []
zip _ [] = []
zip (x:s) (y:t) = (x,y) : zip s t
Ejemplos
zip [1,2,3] [4,5,6] ~>* [(1,4),(2,5),(3,6)]
zip "abcde" [True,False] ~>* [('a',True),('b',False)]
zip [] ["ab","cd"] ~>* []
unzip
unzip es una función unaria que toma una lista de duplas y devuelve dos listas. En la primera lista estarán todos los primeros elementos de las duplas y en la segunda lista estarán todos los segundos elementos de las duplas.
Definición
unzip :: [(a,b)] -> ([a],[b])
unzip [] = ([],[])
unzip ((x,y):s) = (x:t,y:u)
where (t,u) = unzip s
Ejemplos
unzip [(1,2),(3,4),(5,6)] ~>* ([1,3,5],[2,4,6])
unzip [(True,'c'),(False,'s')] ~>* ([True,False],"cs")
zipWith
zipWith es una función ternaria que toma:
- una función binaria
f que de a y b hace c , de tipo a -> b -> c
- una lista de cualquier cosa que la función
f puede tomar como el primer parámetro, de tipo [a]
- una lista de cualquier cosa que la función
f puede tomar como el segundo parámetro, de tipo [b]
La expresión zipWith f s t se evalúa a la lista de los resultados de la aplicación de la función f a los elementos de las listas s y t , de tipo [c] . La lista final tendrá tantos elementos como la lista más corta de las listas s y t .
Definición
zipWith _ [] _ = []
zipWith _ _ [] = []
zipWith f (x:s) (y:t) = (f x y) : zipWith f s t
Ejemplos
zipWith (+) [3,5,4] [2,1,5,8] ~>* [3 + 2, 5 + 1, 4 + 5]
zipWith (:) "abc" ["def","ghi"] ~>* ["adef","bghi"]
Nota
Cuando ya conocemos la función zipWith , podemos definir la función zip de manera siguiente:
zip = zipWith (,)
|