我在向量fs
中有许多谓词函数,并希望and
将它们放在一起。这个适用于前两个函数:
((and (first fs) (second fs)) value)
但是,我想编写将and
应用于所有函数的代码,无论有多少函数。 (apply and fs)
无法编译,因为and
是一个宏。
有关使用and
的谓词函数工作的示例,请尝试以下操作:
((and number? integer?) 1)
修改如果您没有阅读评论,上述两个and
结构都是不完整的示例。对于实际工作的相同构造,请使用every-pred
而不是and
。
答案 0 :(得分:3)
由于您使用的是谓词,every-pred可能会很有用。
阅读完编辑后 - 谢谢,我不知道,你可以用and
做到这一点。另外我编辑了我的答案,我认为你肯定想要应用每个预测
((apply every-pred [number? integer?]) 1)
=> true
((apply every-pred [number? integer?]) "asdf")
=> false
答案 1 :(得分:1)
看起来every-pred
是这个问题的一个很好的答案(我之前没有注意到它!)。 A related function that may be handy是juxt
。它将许多函数应用于单个参数:
((juxt a b c) x) => [(a x) (b x) (c x)]
请注意,与every-pred
不同,juxt
函数不会短路并始终评估列表中的每个函数。一个例子:
(ns tst.clj.core
(:use clj.core clojure.test tupelo.test)
(:require [tupelo.core :as t] ))
(defn f2 [x] (zero? (mod x 2)))
(defn f3 [x] (zero? (mod x 3)))
(defn f5 [x] (zero? (mod x 5)))
(def f235 (apply juxt [f2 f3 f5] ))
这给了我们结果:
(f235 2) => [true false false]
(f235 3) => [false true false]
(f235 5) => [false false true]
(f235 6) => [true true false]
(f235 10) => [true false true]
(f235 15) => [false true true]
(f235 30) => [true true true]
(every? truthy? (f235 15)) => false
(every? truthy? (f235 30)) => true
truthy?
函数类似于boolean
:
(defn truthy?
"Returns true if arg is logical true (neither nil nor false); otherwise returns false."
[arg]
(if arg true false))
P.S。请注意,您的原始示例并未说明(and (f1 x) (f2 x))
,而是说(and f1 f2) => f1
。所以当你输入
(def fs [f1 f2 f3 f4])
((and (first fs) (second fs)) value)
=> ((and f1 f2) value)
=> (f1 value)
没有给出你想要的结果。