Duplicación de cada elemento
Definir la función
1 |
duplicaElementos :: [a] -> [a] |
tal que (duplicaElementos xs) es la lista obtenida duplicando cada elemento de xs. Por ejemplo,
1 2 |
duplicaElementos1 [3,2,5] == [3,3,2,2,5,5] duplicaElementos1 "Haskell" == "HHaasskkeellll" |
Soluciones
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
import Test.QuickCheck -- 1ª solución duplicaElementos1 :: [a] -> [a] duplicaElementos1 [] = [] duplicaElementos1 (x:xs) = x : x : duplicaElementos1 xs -- 2 solución duplicaElementos2 :: [a] -> [a] duplicaElementos2 = foldr (\x ys -> x:x:ys) [] -- 3ª solución duplicaElementos3 :: [a] -> [a] duplicaElementos3 xs = concat [[x,x] | x <- xs] -- 4ª solución duplicaElementos4 :: [a] -> [a] duplicaElementos4 xs = concat (map (replicate 2) xs) -- 5ª solución duplicaElementos5 :: [a] -> [a] duplicaElementos5 = concatMap (replicate 2) -- 6ª solución duplicaElementos6 :: [a] -> [a] duplicaElementos6 = (>>= replicate 2) -- Equivalencia de las definiciones -- ================================ -- La propiedad es prop_duplicaElementos :: [Int] -> Bool prop_duplicaElementos xs = all (== (duplicaElementos1 xs)) [f xs | f <- [duplicaElementos2, duplicaElementos3, duplicaElementos4, duplicaElementos5, duplicaElementos6]] -- La comprobación es -- λ> quickCheck prop_duplicaElementos -- +++ OK, passed 100 tests. |
El código se encuentra en GitHub.
6 Comentarios