[英]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.