gpt4 book ai didi

Clojure 部分应用程序 - 如何获取 'map' 以返回函数集合?

转载 作者:行者123 更新时间:2023-12-04 15:00:58 24 4
gpt4 key购买 nike

我有一个函数,我基本上是从 Clojure google group 的讨论中抽出来的,它接受一个集合和一个任意长度的函数列表,然后过滤它以返回一个新集合,其中包含原始列表的所有元素,其中至少一个函数的计算结果为真:

(defn multi-any-filter [coll & funcs]
(filter #(some true? ((apply juxt funcs) %)) coll))

我正在为 Project Euler Problem 1 制定一个通用的解决方案。 ,所以我这样使用它:
(def f3 (fn [x] (= 0 (mod x 3))))
(def f5 (fn [x] (= 0 (mod x 5))))

(reduce + (multi-any-filter (range 1 1000) f3 f5))

这给出了正确的答案。

但是,我想修改它,以便可以将整数而不是函数传递给它,例如
(reduce + (multi-any-filter (range 1 1000) 3 5))

我可以将 3 和 5 替换为任意数量的整数,并将 (=0 (mod x y)) 的函数包装作为 multi-any-filter 函数中的匿名函数。

不幸的是,这超出了我的 Clojure 能力的极限。我在想我需要对 map 做点什么到 args 列表,但我不确定如何获取 map返回一个函数列表,每个函数都在等待另一个参数。 Clojure 似乎不支持像我在其他函数式语言中学习如何使用柯里化(Currying)的方式。也许我需要使用 partial在正确的位置,但我不太确定如何。

换句话说,我希望能够传递任意数量的参数(不是函数),然后将每个参数包装在同一个函数中,然后将该函数列表传递给 juxt代替 funcs在我的 multi-any-filter上面的功能。

感谢您的任何提示!

最佳答案

(defn evenly-divisible? [x y]
(zero? (mod x y)))

(defn multi-any-filter [col & nums]
(let [partials (map #(fn [x] (evenly-divisible? x %)) nums)
f (apply juxt partials)]
(filter #(some true? (f %)) col)))

我无法使用 partial因为它将 arg 应用于 fn 的第一个位置.我们希望它在 evenly-divisible? 的第二个位置我们可以重新安排 evenly-divisible?但是当它独立使用时,它看起来并不正确。
user=> (reduce + (multi-any-filter (range 1 1000) 3 5))
233168

关于Clojure 部分应用程序 - 如何获取 'map' 以返回函数集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15418860/

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