¡Esta es una revisión vieja del documento!
Tabla de Contenidos
Clase 3
Plan para hoy
Algunas soluciones de la clase anterior
Veamos algunas soluciones presentadas Wiki de Scripts Haskell.
Clase
Veamos el ejercicio 18
Defina la funci\'on paraTodo: (A→ Bool)→ [A]→ Bool, donde paraTodo.p.xs decide si todos los elementos de la lista xs cumplen con el predicado p.
Nuevamente esta función es el típico caso que se resuelve con un caso base y un caso inductivo
paraTodo :: (a->Bool) -> [a] -> Bool paraTodo p [] = True paraTodo p (x:xs) = p x && paraTodo p xs
Notemos que esta función toma como parámetro una función.
- Funciones que toman funciones.
- Funciones de alto orden.
Esto es muy poderoso porque permite escribir programas funcionales que toman programas funcionales y generan otros programas funcionales. Las funciones son ciudadanos de primera categoría no como en otros lenguajes de programación (imperativos).
Definimos rápidamente el predicado noMultiplo p n
que indica cuando p
no es múltiplo de n
.
noMultiplo :: Int -> Int -> Bool noMultiplo p n = p `mod` n >0
Notamos:
- Volvimos infija la función
mod
. - Usamos una versión currificada.
Podríamos haber escrito
noMultiplo' :: (Int,Int) -> Bool noMultiplo' (p,n) = p `mod` n >0
Sin embargo son diferentes pues noMultiplo
permite la aplicación parcial
Main> :t noMultiplo noMultiplo :: Int -> Int -> Bool Main> :t noMultiplo 20 noMultiplo 21 :: Int -> Bool Main> :t noMultiplo 21 2 noMultiplo 21 2 :: Bool
Con estos elementos y la función desdeHasta
que ya figura en sus practico8.hs
, podemos construir la función primo
(ejercicio)
Ejercicios
- (P8,E19) Usando
paraTodo
,desdeHasta
ynoMultiplo
, defina la funciónprimo
. - (P8,E21) Defina la función
iguales :: Eq a ⇒ [a] → [a] → Bool
que retorna true si las listas son iguales. - (P8,E24) Definla la función
mapear :: (a→b) → [a] → [b]
, que dada una funciónf
y una listaxs
aplicaf
a cada elemento de la lista. Escribaduplicar'
ymultiplicar'
utilizandomapear
.