通过使另一个函数的参数不变来创建函数(clojure,newbie)

Vik*_* K. 1 clojure

我刚开始学习clojure,而且我没有太多的函数式编程经验.假设我有一个功能:

(defn process-seq
   [process]
   ...doing something...)
Run Code Online (Sandbox Code Playgroud)

这需要另一个函数作为参数.这个参数应该是一个带有单个参数的函数 - 一个序列.例如 :

(defn filter-odd
  [sequence]
  (filter odd? sequence))
Run Code Online (Sandbox Code Playgroud)

所以我现在可以写:

(process-seq filter-odd)
Run Code Online (Sandbox Code Playgroud)

我不喜欢它是我必须定义filter-odd函数.我想在没有定义它的情况下实现它.我想要的是通过常量谓词传递过滤器函数:奇数?.类似的东西(只是我编写的伪代码):

(process-seq filter(odd?))
Run Code Online (Sandbox Code Playgroud)

有可能吗?

Ósc*_*pez 7

您可以将匿名函数作为参数传递:

(process-seq (fn [sequence] (filter odd? sequence)))
Run Code Online (Sandbox Code Playgroud)

甚至更短:

(process-seq #(filter odd? %))
Run Code Online (Sandbox Code Playgroud)

或者如A.Webb在评论中所提到的,我们可以使用partial:

(process-seq (partial filter odd?))
Run Code Online (Sandbox Code Playgroud)

  • 还``(process-seq(部分过滤器奇数?))` (2认同)
  • Currying将是`(def curried-filter(fn [pred](fn [coll](filter pred coll))))`.在这种情况下,`(部分过滤器奇数?)`对应于`(curried-filter odd?)`. (2认同)