Definir la función
noRepetidos :: Eq a => [a] -> [a] |
tal que (noRepetidos xs) es la lista de los elementos no repetidos de la lista xs. Por ejemplo,
noRepetidos [3,2,5,2,4,7,3] == [5,4,7] noRepetidos "noRepetidos" == "nRptids" noRepetidos "Roma" == "Roma" |
Soluciones
import Test.QuickCheck -- 1ª solución -- =========== noRepetidos :: Eq a => [a] -> [a] noRepetidos xs = [x | x <- xs, ocurrencias x xs == 1] -- (ocurrencias x ys) es el número de ocurrencias de x en ys. Por -- ejemplo, -- ocurrencias 3 [3,2,5,2,4,7,3] == 2 -- ocurrencias 5 [3,2,5,2,4,7,3] == 1 ocurrencias :: Eq a => a -> [a] -> Int ocurrencias x ys = length [y | y <- ys, y == x] -- 2ª solución -- =========== noRepetidos2 :: Eq a => [a] -> [a] noRepetidos2 [] = [] noRepetidos2 (x:xs) | elem x xs = noRepetidos2 [y | y <- xs, y /= x] | otherwise = x : noRepetidos2 xs -- Equivalencia -- ============ -- La propiedad de equivalencia es prop_equivalencia :: [Int] -> Bool prop_equivalencia xs = noRepetidos xs == noRepetidos2 xs -- La comprobación es -- ghci> quickCheck prop_equivalencia -- +++ OK, passed 100 tests. |
Pensamiento
Y en perfecto rimo
— así a la vera del agua
el doble chopo del río.Antonio Machado
Falla para los elementos que aparecen más de dos veces. Por ejemplo,
Falla en el primer ejemplo
pero el 2 y el 3 están repetidos.
En Python