gpt4 book ai didi

clojure - 如何运行对同一个集合进行操作的多个函数,但只遍历集合一次? (clojure,包括示例)

转载 作者:行者123 更新时间:2023-12-04 02:26:46 24 4
gpt4 key购买 nike

有点奇怪,但我基本上需要在向量上运行两个独立的函数。它们都映射到向量上,并返回一个结果。如果我要一个接一个地运行它们,这将意味着遍历集合两次——我将如何做到这一点,以便我只需要映射一次集合,就可以执行这两个功能?函数本身无法更改,因为它们在别处独立使用。我可能没有多大意义,所以举个例子可能会更好:

(defn add-one [xs] (map #(+ % 1) xs))
(defn minus-one [xs] (map #(- % 1) xs))
(def my-xs [1 2 3])
(def result {:added (add-one my-xs) :minused (minus-one my-xs)})

所以,我基本上希望能够计算“结果”,但只需要检查一次“xs”。考虑到函数需要一个集合,我不确定是否有可能做到这一点,但我想我会检查一下,以防我遗漏了一些 clojure 魔法:D

编辑——我可以在这个例子中只使用 inc/dec,但重点是我需要利用对集合进行操作的函数,因为实际函数要复杂得多:)

最佳答案

没有通用的解决方案。如果您有两个任意函数,它们使用一个序列并以某种未知方式对其进行操作以产生结果,则您无法避免遍历该序列两次。

对于函数的各种约束,组合是可能的。您已经在评论中看到如何将 [(map f xs) (map g xs)] 替换为 (apply map list (map (juxt f g) xs));对于具有幺半群结构的消费者,可以做类似的事情,比如组合最小值和最大值,或者如果它们都只是 (fn [xs] (reduce f a xs))

关于clojure - 如何运行对同一个集合进行操作的多个函数,但只遍历集合一次? (clojure,包括示例),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67007139/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com