Clojure - 将函数按顺序应用于参数的正确方法是什么?

gat*_*ado 11 clojure

我不清楚Clojure ->->>Clojure 之间的区别:从API参考来看,后者似乎是顺序应用多个函数的正确方法,即( - >> xhgf)会导致f(g(h) (x))).

这与Lisp类语言如何区分f(x,y)(f(x))(y)有关,而Haskell则不正确?(使用数学符号;逗号旨在暗示n-ary函数,而不是tupling).

提前致谢!

编辑

我错了,除了像(def inc#(+ 1%))这样的简单函数之外,它们都没有工作.

下面是一个不工作的函数的例子->或者->>,

(defn mkinc­ [amnt­] (fn [x] (+ x amnt)­))
(-> 3 (mkin­c 2))
; ERROR -- Wrong number of args (2) passed to: sandbox58780$fn--58797$mkinc
((mkinc 2) 3)
; 5
Run Code Online (Sandbox Code Playgroud)

Sid*_*ddy 21

->并且->>如果所有函数只接受一个参数,则相等.否则,->将作为第一个参数的thread作为函数->>传递给函数,并将其作为最后一个参数传递给函数.以下示例应明确说明:

(-> x
    (f 1 2)
    (g 3 4)
    (h 5 6))
Run Code Online (Sandbox Code Playgroud)

(h (g (f x
         1 2)
      3 4)
   5 6)
Run Code Online (Sandbox Code Playgroud)

要么 h(g(f(x, 1, 2), 3, 4), 5, 6)

(->> x
     (f 1 2)
     (g 3 4)
     (h 5 6))
Run Code Online (Sandbox Code Playgroud)

(h 5 6
   (g 3 4
      (f 1 2 x)))
Run Code Online (Sandbox Code Playgroud)

要么 h(5, 6, g(3, 4, f(1, 2, x)))

编辑 :(响应问题中的编辑,从评论中复制此内容).

该示例不起作用,因为->宏将3作为第一个arg插入mkinc.见(macroexpand-1 '(-> 3 (mkinc 2)))明白这更好.

这确实有效:(-> 3 ((mkinc 2))).看看(macroexpand-1 '(-> 3 ((mkinc 2))))明白为什么.