Enunciado
-- 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" |
-- 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 (por comprensió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ª definición (por recursión):
noRepetidos2 :: Eq a => [a] -> [a]
noRepetidos2 [] = []
noRepetidos2 (x:xs) | elem x xs = noRepetidos2 [y | y <- xs, y /= x]
| otherwise = x : noRepetidos2 xs
-- 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. |
import Test.QuickCheck
-- 1ª solución (por comprensió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ª definición (por recursión):
noRepetidos2 :: Eq a => [a] -> [a]
noRepetidos2 [] = []
noRepetidos2 (x:xs) | elem x xs = noRepetidos2 [y | y <- xs, y /= x]
| otherwise = x : noRepetidos2 xs
-- 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.