我正在学习Clojure,我在网上看到了这段代码:
(count (filter #{42} coll))
如上所述,它确实计算了coll中数字42的出现次数。 #{42}
是一个函数吗?关于过滤器的Clojure文档说它应该是,因为该片段的工作方式与广告一样。我只是不知道它是如何工作的。如果有人能为我澄清这一点,那就太好了。我对同样事情的解决办法是:
(count (filter #(= %1 42) coll))
为什么我的过滤功能有括号,我在网上找到的片段在过滤功能周围有花括号(#(...)
与#{...}
)?
答案 0 :(得分:16)
=> #{42}
#{42}
定义一个集合......
=> (type #{42})
clojure.lang.PersistentHashSet
=> (supers (type #{42}))
#{clojure.lang.IHashEq java.lang.Object clojure.lang.IFn ...}
有趣的是,该集合实现了IFn,因此您可以像处理函数一样对待它。函数的行为是#34;如果该项存在于集合中,则返回"。
=> (#{2 3} 3)
3
=> (#{2 3} 4)
nil
其他集合(如map和vector)以类似的方式作为函数驻留,并根据需要通过键或索引进行检索。
=> ({:x 23 :y 26} :y)
26
=> ([5 7 9] 1)
7
甜蜜,不是吗? : - )
答案 1 :(得分:1)
是的,#{42}
是一个函数,
clojure.lang.IFn
接口。nil
。 #{42}
测试其参数是42
(仅nil
和false
是假的,请记住)。 Clojure的方法是让一切都成为一个有用的功能:
此
get
,filter
和map
以及