【问题标题】:Difference between arrow and double arrow macros in ClojureClojure 中箭头宏和双箭头宏的区别
【发布时间】:2013-10-19 13:59:51
【问题描述】:

Clojure 中的 ->->> 宏有什么区别?

【问题讨论】:

标签: clojure


【解决方案1】:

链接的文档 A. Webb 解释了“什么”,但没有做好“为什么”。

通常,当一个函数作用于单个主题时,该主题是第一个参数(例如,conjassoc)。当函数作用于序列主题时,该主题是最后一个参数(例如,mapfilter)。

因此,->->> 被记录为分别线程化第一个和最后一个参数,但将它们分别应用于单数或连续参数也很有用。

例如,我们可以将向量视为奇异对象:

(-> [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)

【讨论】:

  • 我倾向于认为对第一个和第二个参数进行操作的 Clojure 函数之间的区别与它们是否是高阶函数有关,而不是参数是顺序的。 conjassoc 的第一个参数通常是连续的,mapfilter 的第二个参数也是如此。但是,mapfilter 都是高阶的,并且将它们的函数参数作为第一个参数。所以以这种方式来看,->> 倾向于用于链接高阶函数,而-> 则不然。
  • 您关于单数和连续参数的观点对我来说很有意义!我现在也明白了,为什么我对这些宏感到困惑。问题是我查看了具有唯一参数 f.e. 的函数。 (-> 42 str)(->> 42 str) 都返回 "42"。但是当我浏览上面的例子时,事情对我来说是显而易见的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-26
  • 2011-03-11
  • 1970-01-01
相关资源
最近更新 更多