Clojure基础知识:计算频率

时间:2014-05-03 18:10:00

标签: clojure

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

(count (filter #{42} coll))

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

(count (filter #(= %1 42) coll))

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

2 个答案:

答案 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(仅nilfalse是假的,请记住)。

Clojure的方法是让一切都成为一个有用的功能:

  • 设置为会员资格测试。
  • 地图用作键查找。
  • 向量用作索引查找。
  • 关键字在map参数中作为查找工作。

  • 经常为您节省get
  • 允许您在问题中将裸数据结构传递给更高阶的函数 例如filtermap以及
  • 在关键字的情况下,允许您在地图和记录之间透明地移动 用于保存您的数据。