Eliminaciones anotadas
Definir la función
| 1 |    eliminaciones :: [a] -> [(a,Int,[a])] | 
tal que (eliminaciones xs) es la lista de ternas (x,i,zs) tales que x es un elemento de xs, i es la posición de x en xs y zs es la lista de los restantes elementos de xs. Por ejemplo,
| 1 2 |    λ> eliminaciones [5,7,6,5]    [(5,0,[7,6,5]),(7,1,[5,6,5]),(6,2,[5,7,5]),(5,3,[5,7,6])] | 
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 | import Test.QuickCheck (quickCheck) -- 1ª solución eliminaciones :: [a] -> [(a,Int,[a])] eliminaciones xs = [(z,i,zs) | ((z,zs),i) <- zip (aux xs) [0..]]   where aux []       = []         aux [x]      = [(x,[])]         aux (x:y:zs) = (x,y:zs) : [(v,x:vs) | (v,vs) <- aux (y:zs)] -- 2ª solución eliminaciones2 :: [a] -> [(a,Int,[a])] eliminaciones2 xs =   [(v,i,us++vs) | i <- [0..length xs - 1],                   let (us,v:vs) = splitAt i xs] -- Comprobación de equivalencia -- ============================ -- La propiedad es prop_equivalencia :: [Int] -> Bool prop_equivalencia xs =   eliminaciones xs == eliminaciones2 xs -- La comprobación es --    λ> quickCheck prop_equivalencia --    +++ OK, passed 100 tests. | 
Nuevas soluciones
- En los comentarios se pueden escribir nuevas soluciones.
- El código se debe escribir entre una línea con <pre lang="haskell"> y otra con </pre>