为什么我可以在clojure中使用set作为谓词?

ren*_*ins 1 functional-programming clojure

我正在尝试从列表或集合中删除元素,如下所示:

(remove :Veronica (list :Veronica :Hailey))
Run Code Online (Sandbox Code Playgroud)

它不起作用,所以,我去删除文档,说我需要将谓词传递给remove函数.但是以下代码有效:

(remove #{:foo} [:foo :bar])
(remove #{:foo} (list :foo :bar))
Run Code Online (Sandbox Code Playgroud)

#{:foo}是一个集合.它为什么有效?

是一个功能集?

谢谢

Thu*_*ail 7

为什么如下

(remove :Veronica (list :Veronica :Hailey))
;(:Veronica :Hailey)
Run Code Online (Sandbox Code Playgroud)
  • 通过集合?
  • 没有明显效果?

关键字例如:Veronica是接受一个参数的函数,因此可以用作谓词.

但......

  • 它需要一个map或set参数.
  • 然后它在论证中查明自己.

例如,

(:Veronica #{:Veronica})
;:Veronica

(:Veronica #{1 2 "Buckle my shoe"})
;nil
Run Code Online (Sandbox Code Playgroud)

它也原谅了无用的论点:

(:Veronica 4) ; 4 is not a map or set. 
;nil
Run Code Online (Sandbox Code Playgroud)

所以(:Veronica :Veronica),(:Veronica :Hailey)都是nil,所以remove在

(remove :Veronica (list :Veronica :Hailey))
Run Code Online (Sandbox Code Playgroud)

......什么都不做,因为谓词总是评估假(ish).


其他解决方案解释了原因

(remove #{:foo} (list :foo :bar))
Run Code Online (Sandbox Code Playgroud)

......有你想要的效果.