2014-09-04 3 views
6

В этой записи в блоге, "CSP and transducers in JavaScript", автор заявляет:Являются ли датчики Clojure нетерпеливыми?

Во-первых, мы должны понимать, что многие массива (или другой коллекции) операции, такие как map, filter и reverse могут быть определены в терминах reduce.

then we see Так ряд реализаций этого в Clojure не лень, они хотят:

user> (defn eager-map [f coll] 
     (reduce (fn [acc v] (conj acc (f v))) 
     [] 
     coll)) 
#'user/eager-map 
user> (eager-map inc (range 10)) 
[1 2 3 4 5 6 7 8 9 10] 

Мой вопрос, являются Clojure преобразователи готовы?

ответ

14

Преобразователи - это очень простые функции - у них нет понятия лень или, фактически, как они применяются вообще. В этом красота идеи - с преобразователями мы можем отделить такие функции, как map и filter от того, на чем они работают.

Да, они могут использовать для создания ленивых последовательностей, а также каналов и сокращений. В то время как сам вызов функции преобразователя горит, все зависит от того, что вы передаете преобразователю для его вызова. Ленивые последовательности могут лениво вызывать преобразователи только по мере их потребления, в то время как редукторы будут использовать их с нетерпением, чтобы выплюнуть сокращение.

Вы можете увидеть in the source, где используется для создания ленивой последовательности по коллекции с преобразователем.

Смежные вопросы