如何用n-arg谓词过滤se-of n-tuples?

mik*_*lly 2 clojure

假设我有一个返回一个n元组序列的函数f和一个带有n个参数的谓词p - 如何过滤f以获得一个只包含那些元组的序列,其中p应用于元组的每个元素是真的?

例如,假设f被定义为返回一对对

(defn f [] (for [a (range 1 10) b (range 1 10)] [a b]))
Run Code Online (Sandbox Code Playgroud)

并且p接受两个参数,如果它们相等则返回true

(defn p [a b] (= a b))
Run Code Online (Sandbox Code Playgroud)

我想做这样的事情

(filter p (f))
Run Code Online (Sandbox Code Playgroud)

但是编译器抛出一个ArityException,因为p接受两个参数,序列中的每个元素都被认为是一个东西(尽管是一对).

ez1*_*1sl 5

你错过了apply.它将给定函数应用于参数列表,就好像它们是个体一样.因此,(f 0 1)并且(apply f [0 1])对于大多数实际目的而言是等同的 在你的情况下,它将是:

(filter #(apply p %) (f))
Run Code Online (Sandbox Code Playgroud)