Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure部分应用程序-如何获取';地图';返回函数集合?_Clojure_Higher Order Functions_Partial Application - Fatal编程技术网

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

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

我有一个函数,我基本上是从Clojure google group的讨论中提取的,它获取一个集合和一个任意长度的函数列表,并对其进行过滤以返回一个新集合,其中包含原始列表中的所有元素,其中至少有一个函数的计算结果为true:

(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

你真厉害,这正是我要找的。