Clojure函数向量迭代疑问:匿名函数%含义及count嵌套执行问题
拆解Clojure stats函数的两个困惑
嘿,我来帮你把这个示例里的疑问掰明白,其实核心就是Clojure里函数是一等公民这个特性,咱们一步步看:
1. 匿名函数里的%到底指代什么?
先看stats函数里的关键代码:
(map #(% numbers) [sum count avg])
这里的#(% numbers)是Clojure的匿名函数简写,展开成完整的匿名函数是这样的:
(fn [func] (func numbers))
哦!原来这里的%指代的是函数集合里的每个函数本身——也就是sum、count、avg这三个函数。
map会遍历[sum count avg]这个向量,把每个函数依次传给这个匿名函数:
- 第一次迭代:
%是sum,执行(sum numbers),算出总和; - 第二次迭代:
%是count,执行(count numbers),得到元素个数; - 第三次迭代:
%是avg,执行(avg numbers),算出平均值。
所以stats最终返回的就是这三个函数作用在numbers上的结果集合。
2. 为什么stats能遍历到count?
因为在Clojure里,内置函数和你自己定义的函数地位完全平等——它们都是可以被传递、被当作参数使用的一等公民。
你定义的sum、avg是函数,Clojure自带的count同样是函数,所以把它放进[sum count avg]这个向量里,和另外两个自定义函数没有任何区别。当map遍历到它时,就会像调用sum、avg一样,用它来处理numbers参数,自然就能得到元素数量了。
再用示例验证一遍
比如调用(stats [3 4 10]),实际执行流程是:
- 遍历
[sum count avg],第一个元素是sum,执行(sum [3 4 10])→ 17; - 第二个元素是
count,执行(count [3 4 10])→ 3; - 第三个元素是
avg,执行(avg [3 4 10])→ 17/3; - 最后把这三个结果打包成序列返回,就是
(17 3 17/3),和示例完全一致。
内容的提问来源于stack exchange,提问作者Mr. Robot
相关产品推荐
相关产品推荐

