在Clojure中是补充还是不一样?

时间:2015-03-17 10:43:04

标签: clojure

假设我使用map运行以下not操作:

core=> (map (comp not) [true false true false])
(false true false true)

假设我使用map运行以下complement操作:

core=> (map (complement identity) [true false true false])
(false true false true)

我的问题是: Clojure中的complementnot是否有效?

compliment在创建comppartial的行为有点像<{1}}

3 个答案:

答案 0 :(得分:12)

它们是相同的,您可以在几乎没有变化的情况下获得相同的结果(就像您在代码示例中所做的那样)。如果我们查看complement来源:

,这就变得非常清楚了
(source complement)
=>
(defn complement
  "Takes a fn f and returns a fn that takes the same arguments as f,
  has the same effects, if any, and returns the opposite truth value."
  {:added "1.0"
   :static true}
  [f]
  (fn
    ([] (not (f)))
    ([x] (not (f x)))
    ([x y] (not (f x y)))
    ([x y & zs] (not (apply f x y zs)))))

但它们的含义非常不同 - not正在对值进行操作,并返回值(truefalse)。 complement操作并返回函数。

这可能看起来像是一个实现细节,但它在表达您的内涵时非常重要 - 使用complement清楚地表明您正在创建一个新函数,而not主要用于条件检查。

答案 1 :(得分:1)

相似但不一样。 complement会在立即评估not时返回一个函数。

答案 2 :(得分:0)

对您的问题进行了一些澄清:(comp not)(complement identity)完全相同,因为(comp not)会导致函数执行相同的操作。