假设您有以下代码来获取参数之前的所有素数:
(defn my-filt [x z]
(or (not= 0 (mod z x))
(= z x)))
(defn my-filter [y x]
(filter (partial my-filt x) y))
(defn primes [end_prime]
(reduce my-filter
(cons (range 2 end_prime) (range 2 end_prime))))
(primes 19)
Run Code Online (Sandbox Code Playgroud)
正如你可以看到我用partial my-filt x
,因为我需要在列表x
中的my-filt
功能,因为过滤器只依赖于一个参数。我的问题如下:有没有更好的方法来使用惯用的 clojure 而不在过滤器中使用部分?
我总是喜欢明确说明你在做什么,而不是使用partial
. 例如,我会写:
(filter #(my-filt x %) y)
Run Code Online (Sandbox Code Playgroud)
或有时完整的功能规范:
(fn [z] (my-filt x z))
Run Code Online (Sandbox Code Playgroud)
所以很明显我们是my-filt
用固定参数调用的x
。该fn
语法也为您提供了选项为每个参数,这往往是对读者相当有用的文档提供一个描述性的名称。
当然,partial
如果在固定 arg 之前有任何空闲 arg ,则不能使用。