假设我使用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中的complement
和not
是否有效?
(compliment
在创建comp
时partial
的行为有点像<{1}}
答案 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
正在对值进行操作,并返回值(true
或false
)。 complement
操作并返回函数。
这可能看起来像是一个实现细节,但它在表达您的内涵时非常重要 - 使用complement
清楚地表明您正在创建一个新函数,而not
主要用于条件检查。
答案 1 :(得分:1)
相似但不一样。 complement
会在立即评估not
时返回一个函数。
答案 2 :(得分:0)
对您的问题进行了一些澄清:(comp not)
与(complement identity)
完全相同,因为(comp not)
会导致函数执行相同的操作。