我有一个函数,我基本上是从 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 xy)) 的函数包装作为 multi-any-filter 函数中的匿名函数。
不幸的是,这超出了我的 Clojure 能力的极限。我在想我需要对map
args 列表做些什么,但我不确定如何map
返回一个函数列表,每个函数都在等待另一个参数。Clojure 似乎不支持像我在其他函数式语言中学习如何使用柯里化的方式。也许我需要partial
在正确的位置使用,但我不太确定如何使用。
换句话说,我希望能够传递任意数量的参数(不是函数),然后将这些参数中的每一个都包装在同一个函数中,然后将该函数列表传递juxt
给上面的功能。funcs
multi-any-filter
感谢您的任何提示!