繁体   English   中英

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

[英]Clojure Partial Application - How to get 'map' to return a collection of functions?

我有一个功能,我基本上从Clojure谷歌小组的讨论中拉出来,它采用一个集合和一个任意长度的函数列表,并过滤它以返回一个新的集合,其中包含至少一个原始列表的所有元素函数的计算结果为true:

(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))

我可以用任意数量的int替换3和5,并在multi-any-filter函数中作为匿名函数执行函数包装(= 0(mod xy))。

不幸的是,这超出了我的Clojure能力的极限。 我想我需要用map做一些箭头列表,但是我不知道如何让map返回一个函数列表,每个函数都在等待另一个参数。 Clojure似乎并不支持我学习如何在其他函数式语言中使用它的方式。 也许我需要在正确的位置使用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? 我们可以重新安排evenly-divisible? 但是当它独立使用时它看起来不太正确。

user=> (reduce + (multi-any-filter (range 1 1000) 3 5))
233168

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM