Clojure基础知识:计算频率

vim*_*vim 8 clojure

我正在学习Clojure,我在网上看到了这段代码:

(count (filter #{42} coll))
Run Code Online (Sandbox Code Playgroud)

如上所述,它确实计算了coll中数字42的出现次数.是#{42}功能吗?关于过滤器的Clojure文档说它应该是,因为该片段的工作方式与广告一样.我只是不知道它是如何工作的.如果有人能为我澄清这一点,那就太好了.我对同样事情的解决办法是:

(count (filter #(= %1 42) coll))
Run Code Online (Sandbox Code Playgroud)

为什么我的过滤功能有括号,我在网上找到的片段在过滤功能周围有花括号(#(...)对比#{...})?

pet*_*e23 16

=> #{42}
#{42}
Run Code Online (Sandbox Code Playgroud)

定义一组......

=> (type #{42})
clojure.lang.PersistentHashSet

=> (supers (type #{42}))
#{clojure.lang.IHashEq java.lang.Object clojure.lang.IFn ...}
Run Code Online (Sandbox Code Playgroud)

有趣的是,该集合实现了IFn,因此您可以像处理函数一样对待它.该函数的行为是"如果该项存在于集合中,则返回它".

=> (#{2 3} 3)
3
=> (#{2 3} 4)
nil
Run Code Online (Sandbox Code Playgroud)

其他集合(例如map和vector)以类似的方式作为函数,以适当的方式通过键或索引进行检索.

=> ({:x 23 :y 26} :y)
26
=> ([5 7 9] 1)
7
Run Code Online (Sandbox Code Playgroud)

甜蜜,不是吗?:-)