Eliminar elementos de una lista a partir de una función Haskell

publicado por: Anonymous

buenos días.

He intendo hacerlo con drop (3*n+2) xs, pero me dice que n “variable is not in scope”.

Pero, ya no sé cómo hacerlo.

¿Cómo puedo eliminar los elementos que se encuentran en las posiciones (3*n+2) de la siguiente lista [10,8,7,5,2]?

Es decir, [10,8,7,5,2] –> [10,8,5,2]

solución

En un caso general, supongamos que tenemos una función posFilter que nos diga si tenemos que filtrar una posición dada:

posFilter :: Int -> Bool

Para filtrar estas posiciones, lo más simple es aplicar a la lista un zip con la secuencia [0..] y comprobar:

[x | (x,i) <- zip xs [0..], not (posFilter i)]

Para tu caso particular, es mucho más sencillo. Lo que quieres es quitar un elemento de cada tres:

[x | (x,i) <- zip xs [1..], i `mod` 3 == 0]

O puesto en formato aplicativo:

f :: [a] -> [a]
f [] = []
f xs = ((++) <$> take 2 <*> f . drop 3) xs

Es posible que no hayas visto este tipo de expresiones si aún estás empezando. Quédate con la anterior si te parece más comprensible.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *