Jestem obecnie czyta książkę programowania O'reilly Clojure które mówi, co następuje w to odcinek o leniwych sekwencje:Jak znaleźć długość leniwej sekwencji bez wymuszania realizacji?
Jest możliwe (choć bardzo rzadko) na leniwe sekwencji znać jego długości, a dlatego zwróć go w wyniku liczenia, nie zdając sobie sprawy z jego zawartości.
Moje pytanie brzmi: Jak to się robi i dlaczego jest tak rzadkie?
Niestety, książka nie określa tych rzeczy w tej sekcji. Osobiście uważam, że bardzo przydatna jest znajomość długości leniwej sekwencji przed jej wykonaniem, na przykład na tej samej stronie jest przykładem leniwej sekwencji plików, które są przetwarzane za pomocą funkcji używającej map
. Byłoby miło wiedzieć, ile plików można przetworzyć przed wykonaniem sekwencji.
To oczywiście nie jest jedyny możliwy przykład. A co z '(powtórz 1000 razy)'? '(zakres 100)'? Istnieje wiele rodzajów leniwych sekwencji, które * mogą * znać ich długość, ale nie mają ich zaprogramowane w prosty sposób, ponieważ wymagałyby czasu inżynieryjnego i mają czas potrzebny na wykonanie pewnej niewielkiej przewagi. – amalloy
@amalloy, dlatego powiedziałem "mogę myśleć", może powinienem był dodać "teraz" na końcu :) Nadal pozostaje reszta odpowiedzi - długość leniwej sekwencji jest znana przed jej utworzeniem, więc nie ma prawdziwy zysk w sprytnie realizującej długość w samej sekwencji. – soulcheck
Czy to oznacza, że niemożliwe jest policzenie bez wykonania leniwej sekwencji, która jest wynikiem "filtru"? Powiedz leniwą sekwencję kilku milionów liczb losowych: '(- >> my-rand-int-lazy-seq (filter # (nawet?%)) (Count-without-realizacji))'? – adamneilson