chức năng của tôi trông như thế này:là có một cách lười biếng để viết các chức năng trừ (loại bỏ các mục từ một danh sách)?
minus :: (Eq a) => [a] -> [a] -> [a]
minus [] xs = []
minus (y:ys) xs | y `notElem` xs = y : (minus ys xs)
| otherwise = minus ys xs
Nó có thể được sử dụng như thế này:
[99,44,55,22,23423] `minus` [55,22]
với sản lượng: [99,44,23423]
tôi đã viết này bởi vì tôi đang nhìn vào Dự án Euler vấn đề 7 và Sàng Eratosthenes có vẻ như là công cụ thích hợp, và nó đã được, nhưng tôi tiếp tục đọc xuống Wikipedia page và nhận được một phần về sàng của Euler.
Tôi đã cố gắng sao chép/dán mã và chạy nó trong GHCi, nhưng phiên bản GHCi của tôi không có mô-đun gọi là Data.OrdList và tôi không thể tìm thấy hàm có tên minus
trong Hoogle.
Đây là mã từ Wikipedia:
import Data.OrdList (minus)
primes = euler [2..]
euler (p : xs) = p : euler (xs `minus` map (*p) (p : xs))
Nếu tôi thay thế chức năng trừ của tôi ở đó, tôi nhận được một số lỗi bộ nhớ, bởi vì chức năng của tôi là không lười biếng.
Có cách nào để thực hiện chức năng trừ đi không?
Chức năng trừ của tôi có giống với chức năng trừ trong bài viết trên Wikipedia không?
Cũng giống như một lưu ý: http://hackage.haskell.org/package/primes chứa một rây lười biếng rất hiệu quả của Eratosthenes, dựa trên hàng đợi ưu tiên và mặt nạ ra nhiều rõ ràng không -primes từ danh sách đang được tìm kiếm. – Carl
Tôi sẽ đề xuất một phiên bản mã đơn giản và dễ đọc hơn của bạn (không trả lời câu hỏi, chỉ để cung cấp ý tưởng cho ai đó): '' ls1 'minus' ls2 = [x | x <- ls1, x 'notElem' ls2]' ' – nfs