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.