簡體   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