Хороший способ в ближайшем будущем для отображения функции на нескольких элементах столкновения или последовательности - PullRequest
0 голосов
/ 18 октября 2019

В настоящее время я изучаю Clojure и пытаюсь научиться делать вещи наилучшим образом. Сегодня я смотрю на основную концепцию работы с последовательностью, знаю основы карт, фильтрации и сокращения. Теперь я хочу попробовать что-то сделать с парами элементов в последовательности, и я нашел два способа сделать это. Я применяю функцию println. Вывод просто 12 34 56 7

(def xs [1 2 3 4 5 6 7])
(defn work_on_pairs [xs]
  (loop [data xs]
    (if (empty? data)
      data
      (do
        (println (str (first data) (second data)))
       (recur (drop 2 data))))))
(work_on_pairs xs)

Я имею в виду, я мог бы сделать так

(map println (zipmap (take-nth 2 xs) (take-nth 2 (drop 1 xs))))
;; prints [1 2] [3 4] [5 6], and we loose the last element because zip.

Но это не очень хорошо .. Мой опыт в Python, где яМогу просто сказать zip(xs[::2], xs[1::2]) Но я думаю, что это не способ Clojure сделать это. Поэтому я ищу предложения о том, как сделать то же самое, наилучшим образом Clojure.

Я понимаю, что я новичок в Clojure, я даже не знаю, как называется этот тип операции.

Спасибо за любой ввод

Ответы [ 2 ]

5 голосов
/ 18 октября 2019

Это можно сделать с помощью partition-all:

(def xs [1 2 3 4 5 6 7])

(->> xs
     (partition-all 2)  ; Gives ((1 2) (3 4) (5 6) (7))
     (map (partial apply str))  ; or use (map #(apply str %))
     (apply println))

12 34 56 7

Строка map предназначена только для объединения пар, поэтому "()" не заканчивается ввывод.

Если вы хотите, чтобы каждая пара печаталась в отдельной строке, измените (apply println) на (run! println). Ваш ожидаемый вывод не соответствует вашему коду, так что неясно.

1 голос
/ 29 октября 2019

Если вы хотите окунуться в преобразователи, вы можете сделать что-то похожее на многопоточную (->>) форму принятого ответа, но за один проход данных.

Предполагая

(def xs [1 2 3 4 5 6 7])

уже был оценен,

(transduce
  (comp
    (partition-all 2)
    (map #(apply str %)))

  conj
  []

  xs)

должен дать вам тот же вывод, если вы оберните его в

(apply println ...)

Мы поставляем conj (сокращение fn) и [] (исходная структура данных), чтобы указать, как процесс reduce внутри transduce должен формировать результат.

Я бы не использовал преобразователь для такого маленького списка или такой простой процесс,но хорошо знать, что это возможно!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...