映射 transducer 的结果为何包含元数大于2的分支?
解析Clojure中map Transducer的多输入参数分支
咱们先把这段map transducer的核心源码贴出来,方便对照分析:
([f] (fn [rf] (fn ([] (rf)) ([result] (rf result)) ([result input] (rf result (f input))) ([result input & inputs] ; 这里为啥要有这个分支? (rf result (apply f input inputs))))))
你肯定好奇最后那个带& inputs的分支是干啥用的,其实它是为了处理上游传递多个输入值的场景:
- 首先,transducer的设计是适配各种可折叠(reducible)数据源的,有些数据源不会只传递单个值,比如自定义的reducible实现,或者配合
partition这类工具时,可能会一次推送多个参数给transducer。 - 当映射函数
f本身支持接收多个参数时(比如+、max这类多参函数),这个分支就能派上用场:它会用apply f把所有接收到的输入值传给f,再把f的结果交给下游的归约函数rf。 - 举个实际的例子:如果咱们写
(transduce (map +) conj [[1 2] [3 4]]),这里上游每次传递的是一个包含两个元素的集合,作为多个输入值,apply +会把它们相加,最终得到的结果就是[3 7]——要是没有这个多输入分支,这段代码就没法正常工作了。
简单来说,这个分支是为了让map transducer更灵活,能兼容多参数的映射函数和多输入的数据源场景。
内容的提问来源于stack exchange,提问作者peter pun
相关产品推荐
相关产品推荐

