Eliminaciones anotadas
Definir la función
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,
λ> 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
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.