Clojure中将函数映射到多个coll或sequence上的好方法

use*_*924 0 clojure

我目前正在学习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)
Run Code Online (Sandbox Code Playgroud)

我的意思是我可以这样

(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.
Run Code Online (Sandbox Code Playgroud)

但这并不是真的很好。我的背景是Python,在这里我只能说zip(xs[::2], xs[1::2])但我猜这不是Clojure的方法。因此,我正在寻找有关如何以最佳Clojure方式执行此操作的建议。

我意识到我对Clojure还是很陌生,我什至不知道这种操作叫什么。

感谢您的输入

Car*_*ate 5

这可以通过以下方式完成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
Run Code Online (Sandbox Code Playgroud)

map行仅用于连接对,因此“()”不会最终出现在输出中。

如果要每对打印在自己的行上,请更改(apply println)(run! println)。您的预期输出似乎与您的代码不一致,因此尚不清楚。