kyl*_*llo 6 clojure partial-application higher-order-functions
我有一个功能,我基本上从Clojure谷歌小组的讨论中拉出来,它采用一个集合和一个任意长度的函数列表,并过滤它以返回一个新的集合,其中包含至少一个原始列表的所有元素函数的计算结果为true:
(defn multi-any-filter [coll & funcs]
(filter #(some true? ((apply juxt funcs) %)) coll))
Run Code Online (Sandbox Code Playgroud)
我正在为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))
Run Code Online (Sandbox Code Playgroud)
这给出了正确的答案.
但是,我想修改它,所以我可以传递给它而不是函数,比如
(reduce + (multi-any-filter (range 1 1000) 3 5))
Run Code Online (Sandbox Code Playgroud)
我可以用任意数量的int替换3和5,并在multi-any-filter函数中作为匿名函数执行函数包装(= 0(mod xy)).
不幸的是,这超出了我的Clojure能力的极限.我想我需要对mapargs列表做一些事情,但我不知道如何map返回一个函数列表,每个函数都在等待另一个参数.Clojure似乎并不支持我学习如何在其他函数式语言中使用它的方式.也许我需要partial在正确的位置使用,但我不太确定如何.
换句话说,我希望能够传递任意数量的参数(不是函数),然后将每个参数包装在同一个函数中,然后将该函数列表传递给我的juxt代替以上功能.funcsmulti-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)))
Run Code Online (Sandbox Code Playgroud)
我不能使用,partial因为它将arg应用于第一个位置fn.我们希望它处于evenly-divisible?我们可以重新安排的第二个位置,evenly-divisible?但是当它独立使用时它看起来不太正确.
user=> (reduce + (multi-any-filter (range 1 1000) 3 5))
233168
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
560 次 |
| 最近记录: |