Menu Close

Duplicación de cada elemento

Definir la función

   duplicaElementos :: [a] -> [a]

tal que (duplicaElementos xs) es la lista obtenida duplicando cada elemento de xs. Por ejemplo,

   duplicaElementos1 [3,2,5]    ==  [3,3,2,2,5,5]
   duplicaElementos1 "Haskell"  ==  "HHaasskkeellll"

Soluciones

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.

Posted in Ejercicio

6 Comments

  1. Alejandro Bueno
    duplicaElementos :: [a] -> [a]
    duplicaElementos []     = []
    duplicaElementos (x:xs) = x : x : duplicaElementos xs
  2. Blanca Castro
    duplicaElementos :: [a] -> [a]
    duplicaElementos = foldr (x ys -> x:x:ys) []
  3. Genaro Huerta
    duplicaElementos :: [a] -> [a]
    duplicaElementos xs = concat [[x,x] | x <- xs]
  4. Eduardo Fernández
    duplicaElementos :: [a] -> [a]
    duplicaElementos xs = concat (map (replicate 2) xs)
  5. Pablo Quevedo
    duplicaElementos :: [a] -> [a]
    duplicaElementos = concatMap (replicate 2)

Escribe tu solución

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.