Moja funkcja wygląda tak:Czy istnieje leniwy sposób na zapisanie funkcji minusa (usunięcie elementów z listy)?
minus :: (Eq a) => [a] -> [a] -> [a]
minus [] xs = []
minus (y:ys) xs | y `notElem` xs = y : (minus ys xs)
| otherwise = minus ys xs
Może być stosowany tak:
[99,44,55,22,23423] `minus` [55,22]
z wyjściem: [99,44,23423]
Napisałem to, bo patrzę na Projekt Euler problemu 7 , a Sito Eratostenesa wydaje się być właściwym narzędziem i tak było, ale czytałem dalej Wikipedia page i dotarłem do części o sicie Eulera.
Próbowałem skopiować/wkleić kod i uruchomić go w GHCi, ale moja wersja GHCi nie ma modułu o nazwie Data.OrdList i nie mogłem znaleźć funkcji o nazwie minus
w Hoogle.
Jest to kod z Wikipedii:
import Data.OrdList (minus)
primes = euler [2..]
euler (p : xs) = p : euler (xs `minus` map (*p) (p : xs))
Gdybym zastąpić moją funkcję minus tam, otrzymuję out błędu pamięci, ponieważ moja funkcja nie jest leniwy.
Czy istnieje sposób na wykonanie funkcji leniwy minus?
Czy moja funkcja minusa działa tak samo, jak funkcja minus w artykule z Wikipedii?
Podobnie jak dopiskiem: http://hackage.haskell.org/package/primes zawiera bardzo wydajne leniwe Sito Eratostenesa, na podstawie kolejek priorytetowych oraz maskowania wiele oczywistych non -primes z przeszukiwanej listy. – Carl
Proponuję prostszą i bardziej czytelną wersję twojego kodu (aby nie odpowiedzieć na pytanie, po prostu dać komuś pomysł): '' ls1 'minus' ls2 = [x | x <- ls1, x 'notElem' ls2]' ' – nfs