根据clojure中的列表过滤列表

Dav*_*vid 1 clojure

假设您有以下代码来获取参数之前的所有素数:

(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 而不在过滤器中使用部分?

Ala*_*son 5

我总是喜欢明确说明你在做什么,而不是使用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 ,则不能使用。

  • 我认为这通常是一个很好的建议,但是使用“partial”并没有什么隐含的含义。它和匿名函数一样明确;它只是不经常使用,因为它比 lambda 更长且更分散注意力。 (7认同)