【发布时间】:2013-10-19 13:59:51
【问题描述】:
Clojure 中的 -> 和 ->> 宏有什么区别?
【问题讨论】:
标签: clojure
Clojure 中的 -> 和 ->> 宏有什么区别?
【问题讨论】:
标签: clojure
链接的文档 A. Webb 解释了“什么”,但没有做好“为什么”。
通常,当一个函数作用于单个主题时,该主题是第一个参数(例如,conj、assoc)。当函数作用于序列主题时,该主题是最后一个参数(例如,map、filter)。
因此,-> 和 ->> 被记录为分别线程化第一个和最后一个参数,但将它们分别应用于单数或连续参数也很有用。
例如,我们可以将向量视为奇异对象:
(-> [1 2 3]
(conj 4) ; (conj [1 2 3] 4)
(conj 5) ; (conj [1 2 3 4] 5)
(assoc 0 0)) ; (assoc [1 2 3 4 5] 0 0)
=> [0 2 3 4 5]
或者我们可以将其视为一个序列:
(->> [1 2 3]
(map inc) ; (map inc [1 2 3])
(map inc) ; (map inc (2 3 4))
(concat [0 2])) ; (concat [0 2] (3 4 5))
=> (0 2 3 4 5)
【讨论】:
conj 或 assoc 的第一个参数通常是连续的,map 或 filter 的第二个参数也是如此。但是,map 和 filter 都是高阶的,并且将它们的函数参数作为第一个参数。所以以这种方式来看,->> 倾向于用于链接高阶函数,而-> 则不然。
(-> 42 str) 和 (->> 42 str) 都返回 "42"。但是当我浏览上面的例子时,事情对我来说是显而易见的。