# PLP | Practica 0 ejercicio 4
```haskell
-- Ejercicio 4: Definir las siguientes funciones SOBRE LISTAS
-- a) limpiar, que elimina todas las apariciones de cualquier caracter de la primera cadena en la segunda.
-- Por ejemplo: ''susto'' ''puerta'' evalua a ''pera''
-- Nota: string es un renombre de [Char]. La notación ''hola'' es equivalenta a ['h','o','l','a'] y a 'h':'o':'l':'a':[]
limpiar :: String -> String -> String
limpiar [] ys = ys -- Caso base: si la primera cadena está vacía, devuelvo la segunda cadena
limpiar (x:xs) ys = limpiar xs (eliminar x ys) -- Caso recursivo: elimino el primer caracter de la segunda cadena y sigo con el resto
eliminar :: Char -> String -> String -- Funcionar auxiliar para eliminar un char
eliminar _ [] = [] -- Caso base: si la cadena está vacía, devuelvo la cadena vacía
eliminar x (y:ys) | x == y = eliminar x ys
| otherwise = y : eliminar x ys
-- b) difPromedio, que dada una lista de numeros devuelve la diferencia de cada uno con el promedio general.
-- Ejemplo: difPromedio [2,4,3] evalua a [-1,1,0]
-- Para hacer esto primero se debe calcular el promedio de la lista de numeros y luego restar a cada numero el promedio obtenido.
difPromedio :: [Float] -> [Float]
difPromedio xs = map (\x -> x - promedio xs) xs
promedio :: [Float] -> Float
promedio xs = sumaLista xs / fromIntegral (length xs)
sumaLista :: [Float] -> Float
sumaLista [] = 0
sumaLista (x:xs) = x + sumaLista xs
-- c) todos iguales que indica si una lista de enteros tiene todos sus elemtnso iguales
todosIguales :: [Int] -> Bool
todosIguales [] = True
todosIguales [x] = True
todosIguales (x:y:xs) | x == y = todosIguales (y:xs)
| otherwise = False
```