理解Clojure偏

rob*_*oli 9 clojure

我正在阅读Clojure编程书.我是关于偏爱的一个例子,它是这样的:

(def only-strings (partial filter string?))
Run Code Online (Sandbox Code Playgroud)

问题是,如果我写下一个函数:

(defn only-strings [x] (filter string? x))
Run Code Online (Sandbox Code Playgroud)

我可以得到相同的结果:

user=> (only-strings [6 3 "hola" 45 54])
("hola")
Run Code Online (Sandbox Code Playgroud)

在这里使用部分有什么好处?或者这个例子只是为了简单地展示它们?有人可以给我一个例子,其中partial可能有用.非常感谢.

Art*_*ldt 9

这最终归结为个人风格的问题,你可以用匿名函数做部分事情,尽管有时partial会使它更漂亮.将第一个参数应用于可变参数函数就是一个例子:

user> (def bigger+ (partial + 7 42)) 
#'user/bigger+
user> (bigger+ 1 2)
52
Run Code Online (Sandbox Code Playgroud)

相比:

user> (def bigger+ (fn [& nums] (apply + 7 42 nums)))
#'user/bigger+
user> (bigger+ 1 2)
52
Run Code Online (Sandbox Code Playgroud)

当然,如果你看起来更好,你可以自由选择第二个.


n2o*_*n2o 8

partial在这种情况下的好处是你可以修复第一个参数并将其绑定到string?.

这甚至都是partial.正如您在Arthur的示例中所看到的那样,预定义第一个参数.

(def foo (partial + 1 2))

(foo 3 4)    ; same as (+ 1 2 3 4)
;=> 10
Run Code Online (Sandbox Code Playgroud)

与部分I结合的前两个参数12在这种情况下.

为什么这有用呢?

您可能想要使用mapapply在一个函数上,该函数有两个参数.这将是非常糟糕的,因为map和apply需要一个函数,需要一个参数.所以你可以修复第一个参数并使用它partial来获得一个只需要一个参数的新函数.因此它可以与map或apply一起使用.

在我的一个项目中,我有这个案例.我想过使用partial或匿名功能.因为我只在一个案例中需要它,所以我使用了lambda.但是如果你需要它不止一次,那么用partial定义一个新函数会非常有用.