Clojure:分离comp和部分参数

leo*_*bot 4 clojure

假设我有一个需要两个参数的函数,并且参数的顺序会影响结果.

是否可以将第一个参数传递给partial或comp函数而另一个参数除以它,如下所示:

(defn bar [arg1 arg2] (- arg1 arg2))
(def baz (partial (bar arg1)))
(def qux (comp str (bar arg1)))

(baz arg2)
(qux arg2)
Run Code Online (Sandbox Code Playgroud)

如果我想将arg2传递给函数,我可以这样做吗?

(def baz2 (partial (bar _ arg2)))
(def qux2 (comp str (bar _ arg2)))

(baz arg1)
(qux arg1)
Run Code Online (Sandbox Code Playgroud)

Fra*_*ila 9

partial只在左侧"填写"参数,所以如果你需要跳过参数,你必须使用fn:

(def baz2 #(bar %1 arg2))
Run Code Online (Sandbox Code Playgroud)

还要注意的是comp要求所有的参数是功能,让您quxqux2实际上是无稽之谈.他们应该是:

(def qux (comp str baz))
(def qux2 (comp str baz2))
Run Code Online (Sandbox Code Playgroud)

在一般情况下,Clojure的核心功能将会把最有可能改变的变量最后使组成与comppartial更自然.(例如,集合参数在Clojure中几乎总是最后的,除了into将它放在第一位之外的地方.)当你设计自己的函数时,你应该坚持这个约定,这样你就可以更容易地编写你的函数.