Tôi muốn có một cách thuận tiện để tạo ra một Iterable
, cho một đối tượng ban đầu và một hàm để tạo ra đối tượng tiếp theo từ hiện tại, tiêu thụ bộ nhớ O (1) (tức là nó không lưu vào bộ nhớ cache kết quả cũ; nếu bạn muốn lặp lại lần thứ hai, hàm này sẽ được áp dụng lại).Tạo một O (1) -memory Lặp lại từ một đối tượng ban đầu và một hàm tạo đối tượng tiếp theo, trong Scala
Dường như không có thư viện hỗ trợ cho việc này. Trong Scala 2.8, phương pháp scala.collection.Iterable.iterate
có chữ ký
def iterate [A] (start: A, len: Int)(f: (A) ⇒ A) : Iterable[A]
vì thế nó đòi hỏi bạn phải xác định có bao nhiêu ứng dụng chức năng lặp bạn quan tâm trước thời hạn, và sự hiểu biết của tôi về các tài liệu là Iterable.iterate
thực sự tính toán tất cả các giá trị ngay. Mặt khác, phương pháp scala.collection.Iterator.iterate
có chữ ký
def iterate [T] (start: T)(f: (T) ⇒ T) : Iterator[T]
trông tuyệt vời, nhưng chúng tôi chỉ nhận được một Iterator
mà không cung cấp tất cả sự tiện lợi của map
, filter
và bạn bè.
Có phương pháp thư viện thuận tiện để sản xuất những gì tôi muốn không?
và nếu không,
Ai đó có thể đề nghị các Scala mã 'ngôn ngữ giao tiếp' để làm điều này?
Để tóm tắt, được đưa ra một đối tượng ban đầu a: A
, và một hàm f: A => A
, tôi muốn một TraversableLike
(ví dụ, có thể là một Iterable
) mà tạo ra a, f(a), f(f(a)), ...
, và sử dụng O (1) bộ nhớ, với map
, filter
vv chức năng mà cũng trả lại cái gì đó là O (1) trong bộ nhớ.
Một "đầu mối": đọc API một số chi tiết khác, tôi bắt đầu nghi ngờ rằng một câu trả lời hay sẽ đề cập đến 'TraversableViewLike', nhưng tôi cũng ngày càng bối rối. –
Iterator * có * bản đồ, bộ lọc và bạn bè ... Bạn có chắc chắn họ sử dụng nhiều hơn bộ nhớ không đổi? – huynhjl
Đó là sự thật, bản đồ và bộ lọc và như vậy có sẵn trên 'Iterator', và không thử bất cứ điều gì ngớ ngẩn như buộc' Iterator'. Nhưng một 'Iterable' sẽ thuận tiện hơn; tại sao tôi không nên mong đợi để có thể sử dụng 'đuôi' (trong đó, bất cứ khi nào' iterator' được gọi, nên loại bỏ các yếu tố đầu tiên thông qua một cuộc gọi đến 'next' trước khi giao lại' Iterator'), vv? (Trong thực tế, khi tôi cố gắng chuyển đổi mã của tôi từ mong đợi 'Iterable' để 'Iterator' s, đây là một cái gì đó tôi đã phải làm việc xung quanh.) –