Clojure部分应用程序-如何获取';地图';返回函数集合?
我有一个函数,我基本上是从Clojure google group的讨论中提取的,它获取一个集合和一个任意长度的函数列表,并对其进行过滤以返回一个新集合,其中包含原始列表中的所有元素,其中至少有一个函数的计算结果为true:Clojure部分应用程序-如何获取';地图';返回函数集合?,clojure,higher-order-functions,partial-application,Clojure,Higher Order Functions,Partial Application,我有一个函数,我基本上是从Clojure google group的讨论中提取的,它获取一个集合和一个任意长度的函数列表,并对其进行过滤以返回一个新集合,其中包含原始列表中的所有元素,其中至少有一个函数的计算结果为true: (defn multi-any-filter [coll & funcs] (filter #(some true? ((apply juxt funcs) %)) coll)) 我在玩弄一个通用的解决方案,所以我使用它如下: (def f3 (fn [x
(defn multi-any-filter [coll & funcs]
(filter #(some true? ((apply juxt funcs) %)) coll))
我在玩弄一个通用的解决方案,所以我使用它如下:
(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))
这给出了正确的答案
但是,我想修改它,这样我就可以向它传递int而不是函数,比如
(reduce + (multi-any-filter (range 1 1000) 3 5))
其中,我可以用任意数量的int替换3和5,并将(=0(mod x y))作为multi-any过滤器函数内的匿名函数进行函数包装
不幸的是,这已经超出了我Clojure能力的极限。我想我需要使用将
映射到参数列表,但我不确定如何让映射
返回函数列表,每个函数都在等待另一个参数。Clojure似乎不支持我在其他函数式语言中学习的咖喱。也许我需要在正确的位置使用partial
,但我不太确定如何使用
换句话说,我希望能够传递任意数量的参数(不是函数),然后将这些参数包装到同一个函数中,然后将函数列表传递到juxt
,以代替上面我的多任意过滤器函数中的funcs
谢谢你的提示
(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
的第一个位置。我们希望它位于第二个位置可均匀分割?
我们可以在可均匀分割?
中重新排列,但是单独使用它时,它看起来并不正确
user=> (reduce + (multi-any-filter (range 1 1000) 3 5))
233168
你真厉害,这正是我要找的。