Haskell Hero

Haskell Hero es un manual interactivo del lenguaje Haskell para principiantes.

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 (,)