如何应用每个谓词函数(`和`他们)

时间:2017-02-15 02:28:00

标签: clojure

我在向量fs中有许多谓词函数,并希望and将它们放在一起。这个适用于前两个函数

((and (first fs) (second fs)) value)

但是,我想编写将and应用于所有函数的代码,无论有多少函数。 (apply and fs)无法编译,因为and是一个宏。

有关使用and的谓词函数工作的示例,请尝试以下操作:

((and number? integer?) 1)

修改如果您没有阅读评论,上述两个and结构都是不完整的示例。对于实际工作的相同构造,请使用every-pred而不是and

2 个答案:

答案 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 handyjuxt。它将许多函数应用于单个参数:

((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)

没有给出你想要的结果。