Стремятся ли преобразователи Clojure?

В этой записи блога "CSP и преобразователи в JavaScript" автор заявляет:

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

Итак, мы видим, что ряд реализаций этого в 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?

1 ответ

Решение

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

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

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

Другие вопросы по тегам