根据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)

正如你可以看到我用partial my-filt x,因为我需要在列表x中的my-filt功能,因为过滤器只依赖于一个参数。我的问题如下:有没有更好的方法来使用惯用的 clojure 而不在过滤器中使用部分?

回答

我总是喜欢明确说明你在做什么,而不是使用partial. 例如,我会写:

(filter  #(my-filt x %)  y)

或有时完整的功能规范:

(fn [z] (my-filt x z))

所以很明显我们是my-filt用固定参数调用的x。该fn语法也为您提供了选项为每个参数,这往往是对读者相当有用的文档提供一个描述性的名称。

当然,partial如果在固定 arg 之前有任何空闲 arg ,则不能使用。

  • I think this is generally good advice, but there's nothing implicit about using `partial`. It's just as explicit as an anonymous function; it's just not used very often because it's both longer and more distrcting than a lambda.

以上是根据clojure中的列表过滤列表的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>