Elementos adicionales
Definir la función
adicionales :: Ord a => Int -> [a] -> [a] -> [a]
tal que (adicionales n xs ys) es la lista de los n elementos de que no pertenecen a ys (se supone que las listas xs e ys están ordenadas y que pueden ser infinitas). Por ejemplo,
adicionales 0 [1,3] [1,3] == [] adicionales 1 [1,3] [1] == [3] adicionales 2 [1,3,5] [1] == [3,5] adicionales 2 [1,3,5,7,9] [1,5,7] == [3,9] adicionales 2 ([1,3,5]++[7..]) ([1]++[7..]) == [3,5]
Soluciones
-- 1ª definición (por recursión) adicionales1 :: Ord a => Int -> [a] -> [a] -> [a] adicionales1 0 _ _ = [] adicionales1 _ xs [] = xs adicionales1 n (x:xs) (y:ys) | x < y = x : adicionales1 (n-1) xs (y:ys) | x == y = adicionales1 n xs ys | otherwise = adicionales1 n (x:xs) ys -- 2ª definición (por comprensión): adicionales2 :: Ord a => Int -> [a] -> [a] -> [a] adicionales2 n xs ys = take n [x | x <- xs, x `noPertenece` ys] -- (noPertenece x ys) se verifica si x no pertenece a la lista ordenada -- (posiblemente infinita ys). Por ejemplo. -- noPertenece 2 [3,5] == True -- noPertenece 4 [3,5] == True -- noPertenece 7 [3,5] == True -- noPertenece 4 [3,5..] == True noPertenece :: Ord a => a -> [a] -> Bool noPertenece x ys = null zs || head zs /= x where zs = dropWhile (<x) ys