Mi función es el siguiente:¿existe alguna forma de escribir la función menos (eliminar elementos de una lista)?
minus :: (Eq a) => [a] -> [a] -> [a]
minus [] xs = []
minus (y:ys) xs | y `notElem` xs = y : (minus ys xs)
| otherwise = minus ys xs
Se puede utilizar la siguiente manera:
[99,44,55,22,23423] `minus` [55,22]
con la salida: [99,44,23423]
escribí esto porque estoy mirando problema Proyecto Euler 7 , y el Tamiz de Eratóstenes parece ser la herramienta correcta, y lo fue, pero seguí leyendo el Wikipedia page y llegué a la parte sobre el tamiz de Euler.
Intenté copiar/pegar el código y ejecutarlo en GHCi, pero mi versión de GHCi no tiene un módulo llamado Data.OrdList, y no pude encontrar una función llamada minus
en Hoogle.
Este es el código de Wikipedia:
import Data.OrdList (minus)
primes = euler [2..]
euler (p : xs) = p : euler (xs `minus` map (*p) (p : xs))
Si sustituyo mi función menos allí, me sale un error de falta de memoria, porque mi función no es perezoso.
¿Hay alguna manera de hacer una función de menos perezoso?
¿Mi función menos hace lo mismo que la función menos en el artículo de Wikipedia?
Así como una nota: http://hackage.haskell.org/package/primes contiene un tamiz perezoso muy eficiente de Eratóstenes, basado en colas de prioridad y enmascaramiento de muchos no obvia -primas de la lista que se busca. – Carl
Sugeriría una versión más simple y más fácil de leer de su código (no para responder a la pregunta, solo para darle una idea a alguien): '' ls1 'minus' ls2 = [x | x <- ls1, x 'notElem' ls2]' ' – nfs