Clojure - 当“comp”从右向左移动时,这是如何工作的?
Clojure - How does this work when `comp` goes from right to left?
comp
的文档指出它从最右边的函数开始,将参数应用于它,然后将结果提供给下一个函数,依此类推。因此,这里先添加数字,然后将 str
应用于整数 16:
((comp str +) 8 8) ;;=> "16"
此代码来自 core.async
webinar:
中的示例 7
mouse (events->chan js/window EventType.MOUSEMOVE
(chan 1
(comp (map mouse-loc->vec)
(filter (fn [[_ y]] (zero? (mod y 5)))))))
此处鼠标事件流是参数。它们首先被转换成一对(元组 2 向量),然后过滤这些对。 map
函数(恰好是一个转换器)需要在 filter
函数之前接收鼠标事件,显然这就是实际发生的情况,因为这段代码有效。那么为什么第一个操作(map
函数)不是 comp
最右边的函数参数?
答案 在 25:30 的 video 中,Rich Hickey 说 "transducers ruin comp
or something like that" - 之后他解释了这个问题。谢谢@nblumoe
这是传感器文档中的一个片段,解释了行为:
Composition of the transformer runs right-to-left but builds a transformation stack that is applied left-to-right
http://clojure.org/transducers(参见"Defining Transformations with transducers")
comp
的文档指出它从最右边的函数开始,将参数应用于它,然后将结果提供给下一个函数,依此类推。因此,这里先添加数字,然后将 str
应用于整数 16:
((comp str +) 8 8) ;;=> "16"
此代码来自 core.async
webinar:
mouse (events->chan js/window EventType.MOUSEMOVE
(chan 1
(comp (map mouse-loc->vec)
(filter (fn [[_ y]] (zero? (mod y 5)))))))
此处鼠标事件流是参数。它们首先被转换成一对(元组 2 向量),然后过滤这些对。 map
函数(恰好是一个转换器)需要在 filter
函数之前接收鼠标事件,显然这就是实际发生的情况,因为这段代码有效。那么为什么第一个操作(map
函数)不是 comp
最右边的函数参数?
答案 在 25:30 的 video 中,Rich Hickey 说 "transducers ruin comp
or something like that" - 之后他解释了这个问题。谢谢@nblumoe
这是传感器文档中的一个片段,解释了行为:
Composition of the transformer runs right-to-left but builds a transformation stack that is applied left-to-right
http://clojure.org/transducers(参见"Defining Transformations with transducers")