La mia funzione è simile al seguente:c'è un modo pigro per scrivere la funzione meno (rimuovere elementi da 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
Può essere utilizzato in questo modo:
[99,44,55,22,23423] `minus` [55,22]
con uscita: [99,44,23423]
ho scritto questo perché sto guardando Project Euler problema 7 e il setaccio di Eratostene sembra lo strumento giusto, e lo è stato, ma ho continuato a leggere il numero Wikipedia page e sono arrivato alla parte sul setaccio di Eulero.
Ho provato a copiare/incollare il codice ed eseguirlo in GHCi, ma la mia versione di GHCi non ha un modulo chiamato Data.OrdList e non ho trovato una funzione chiamata minus
in Hoogle.
Questo è il codice da Wikipedia:
import Data.OrdList (minus)
primes = euler [2..]
euler (p : xs) = p : euler (xs `minus` map (*p) (p : xs))
Se sostituisco la mia funzione meno in là, ottengo un errore di memoria, perché la mia funzione non è pigro.
C'è un modo per rendere una funzione meno pigro?
La funzione Minus fa la stessa cosa della funzione minus nell'articolo di Wikipedia?
Proprio come una nota: http://hackage.haskell.org/package/primes contiene una molto efficiente vaglio pigro di Eratostene, sulla base di code di priorità e mascherando molti ovvio non -primi dall'elenco in ricerca. – Carl
Suggerirei una versione più semplice e leggibile del codice (non per rispondere alla domanda, solo per fornire un'idea per qualcuno): '' ls1 'minus' ls2 = [x | x <- ls1, x 'notElem' ls2]' ' – nfs