Промежуточные шаги между вторым и третьим примерами одинаковы для этого конкретного примера. Это связано с тем, что map и filter реализованы как ленивые преобразования последовательности в последовательность, как вы, несомненно, уже знаете.
Версии преобразователя карты и фильтра определяются с использованием той же основной функциональности, что и версии без преобразователя, за исключением того, что они «сопрягаются» (или нет, в случае фильтра) с потоком результатов. определен в другом месте. Действительно, если вы посмотрите на источник карты, там есть явные функции построения структуры данных, в то время как вариант преобразователя не использует такие функции — они передаются через rf
. Явное использование cons
в версиях без преобразователя означает, что они всегда будет иметь дело с последовательностями
ИМО, основное преимущество использования преобразователей заключается в том, что у вас есть возможность определить процесс, который вы выполняете, помимо того, что будет использовать ваш процесс. Поэтому, возможно, более интересным переписыванием вашего третьего примера может быть:
(def process (comp (filter even)
(map #(* 7 %))))
(defn f [coll] (transduce process + collection))
Это упражнение для автора приложения, чтобы решить, когда такая абстракция необходима, но она определенно может открыть возможность для повторного использования.
Вам может прийти в голову, что вы можете просто переписать
(defn process [coll]
((comp
(partial map #(* 7 %)
(partial filter even?)) coll))
(reduce + (process coll))
И получить тот же эффект; это верно. Если ваш ввод всегда представляет собой последовательность (или всегда один и тот же тип потока / вы знаете, какой это будет поток), возможно, нет веской причины для создания преобразователя. Но здесь можно продемонстрировать силу повторного использования (предположим, что процесс — это преобразователь).
(chan 1 process) ;; an async channel which runs process on all inputs
(into [] process coll) ;; writing to a vector
(transduce + process coll) ;; your goal
Мотивация преобразователей заключалась в том, чтобы перестать писать новые функции сбора для разных типов сбора. Рич Хикки упоминает о своем разочаровании в написании таких функций, как map‹ map> mapcat‹ mapcat> и т. д. в основной асинхронной библиотеке — что map и mapcat являются, уже определено. , но так как они предполагают, что работают с последовательностями (явные cons
, о которых я упоминал выше), их нельзя применять к асинхронным каналам. Но каналы могут предоставлять свои собственные rf
в версии преобразователя, чтобы позволить им повторно использовать эти функции.
person
matrix10657
schedule
04.09.2016
reduce
является стандартной функцией Haskell. Хотя я полагаю, вы, вероятно, имеете в виду один изfoldr1
илиfoldl1
< /а>. - person Alec   schedule 04.09.2016O(n)
, а 2-й —O(3n)
? - person Fuad Saud   schedule 04.09.2016k
положительного натурального числа, поэтому между O(n) и O(3n) или O(1000n) нулевое различие. Если вы хотите сказать, что код X выполняет ровноn
вычислительных шагов/распределения памяти/все, что вы хотите измерить, вы должны сказать, что код X имеет сложностьn
(илиn+k
, если хотите), а код Y имеет сложность3n+k
, где обе функции принадлежат множеству O(n), которое является тем же набором функций, что и O(3n) и O(kn) для каждого положительногоk
. - person Bakuriu   schedule 04.09.2016vector
, но теперь я ни в чем не уверен! Я должен буду на самом деле прочитать источник! - person Alec   schedule 04.09.2016vector
- самый большой, о котором я знаю, который, к сожалению, сильно усложнен различными факторами, но я думаю, что есть еще один пакет под названиемstream-fusion
или что-то в этом роде. - person dfeuer   schedule 04.09.2016stream-fusion
буквально является реализацией первой статьи по слиянию потоков, на которую я ссылался выше. И этот пакет не обновлялся с 2013 года. :S Кроме того, немного не по теме, но я только что понял, что вы тот человек, который может спросить об этом: есть ли какая-либо литература/документация по методам слияния вcontainers
? - person Alec   schedule 04.09.2016containers
не имеет какой-либо общей структуры слияния; он просто реализует несколько простых законов слияния, таких какmap/map
,traverse/map
,map/reverse
и т. д. Если вам нужно больше, дайте мне знать на GitHub. - person dfeuer   schedule 04.09.2016