Как понять этот пример кота? - PullRequest
2 голосов
/ 13 июня 2019

На сайте clojuredocs.com есть пример cat

(into [] (comp cat cat (map inc)) [[[1] [2]] [[3] [4]]])

Как я знаю, comp применяет fn слева направо, но приведенный выше пример, кажется, применяется справа налево.Как я могу это прочитать?

Ответы [ 2 ]

2 голосов
/ 13 июня 2019

Краткий ответ: comp -ing преобразователи запускает их в основном слева направо.

Сверху документы:

Преобразователи составляют обычныефункция композиции.Преобразователь выполняет свою работу, прежде чем решить, следует ли и сколько раз вызывать преобразователь, который он оборачивает.Рекомендуемый способ составления преобразователей - с использованием существующей функции comp:

(def xf
  (comp
    (filter odd?)
    (map inc)
    (take 5)))

Преобразователь xf - это стек преобразований, который будет применен процессом к ряду входных элементов.Каждая функция в стеке выполняется перед операцией, которую она упаковывает. Композиция преобразователя работает справа налево, но создает стек преобразования, который работает слева направо (фильтрация происходит перед отображением в этом примере) .

Как мнемоника, помните, чтоупорядочение функций преобразователя в comp соответствует порядку преобразования последовательности в - >>.Преобразование выше эквивалентно преобразованию последовательности:

(->> coll
     (filter odd?)
     (map inc)
     (take 5))
2 голосов
/ 13 июня 2019

«Секрет» заключается в функции comp, которая применяет функции справа налево, а для преобразователей - слева направо .

Поскольку вы преобразуете, (comp cat cat (map inc)) похоже на
(fn [xs] (map inc (sequence cat (sequence cat xs)))) (обратите внимание, что нет версии cat, которая принимает колл)

...