【发布时间】:2014-06-20 07:37:15
【问题描述】:
我正在学习Clojure,在网上看到了这段代码:
(count (filter #{42} coll))
如前所述,它确实计算 coll 中数字 42 的出现次数。 #{42} 是一个函数吗?关于过滤器的 Clojure 文档说它应该是,因为 sn-p 像宣传的那样工作。我只是不知道它是如何工作的。如果有人可以为我澄清这一点,那就太好了。我自己对同一件事的解决方案是:
(count (filter #(= %1 42) coll))
为什么我的过滤函数有括号,而我在网上找到的sn-p在过滤函数周围有花括号(#(...) vs. #{...})?
【问题讨论】:
-
你看到这个答案了吗? stackoverflow.com/questions/3249334/…
-
不,我没有看到那个答案。我可以看到他们也在使用类似的代码。还提到
(#{x} x)返回x。我只是不明白#{x}作为一个函数在做什么。不就是一套吗? -
看我的回答。集合不仅仅是一个集合——除此之外,它是一个 IFn,因此您可以将其视为一个函数。
-
这是切线相关的,但如果你不知道,Clojure 还有一个名为frequencies 的函数,它对这种情况很有用。它生成集合中每个项目到其出现次数的映射。因此,您可以像这样执行上述操作:
((frequencies coll) 42)--(frequencies coll)生成一个映射,该映射用作查找42并返回出现次数的函数。 (编辑:公平地说,这不是性能)
标签: clojure