clojure - 将函数组合为 clojure 中高级函数的可选参数

标签 clojure composition

我正在尝试在 Clojure 中创建一个多参数函数,如果给定一个向量参数,则只需将另一个函数应用于该向量;如果给定一个向量加上 1 个或多个函数,则将这些函数的组合映射到向量上,然后应用第三个函数。但不知何故,我似乎无法访问第一个之外的任何可选参数。

玩具示例代码:

(defn times2 [num] (* 2 num))
(defn square [num] (* num num))
(defn plusfiveall [vec-of-nums] (map #(+ 5 %) vec-of-nums))
(defn toynums
  ([vec-of-nums] 
   (plusfiveall vec-of-nums))
  ([vec-of-nums & [funcs]]
   (let [moremath (comp funcs)]
      (plusfiveall (map moremath vec-of-nums)))))

我认为应该发生的事情:

(toynums [1 2 3]) = (6 7 8)

(toynums [1 2 3] times2) = (7 9 11)

(toynums [1 2 3] times2 square) = (7 13 23)

但是,虽然前两个示例按预期工作,但第三个示例无法应用 square:相反,我得到 (toynums [1 2 3] times2 square) - -> (7 9 11)

为了深入研究问题,我还尝试了没有映射的版本,并且具有相同的令人惊讶的行为:

(defn comp-nomap 
  ([num] (plusfive num))
  ([num & [funcs]] 
   (let [funmath (comp funcs)] 
     (plusfive (funmath num)))))

(comp-nomap 3) = 8 如预期

(comp-nomap 3 times2) = 11 如预期

但是(comp-nomap 3 times2 square)也= 11,而不是应有的23。

帮忙?谢谢!

最佳答案

您的第二个参数使用可变参数的解构,这将始终从提供的函数中提取第一个函数。您还需要将 apply comp 函数应用于序列中的参数:

(defn comp-nomap
  ([num] (plusfive num))
  ([num & funcs]
    (let [funmath (apply comp funcs)]
      (plusfive (funmath num)))))

关于clojure - 将函数组合为 clojure 中高级函数的可选参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35817507/

相关文章:

clojure - Clojure中两个 map 之间的交集

clojure - 如何在 hiccup 中重复向量中的项目列表?

clojure - Om 下一个教程 : Correctly calling the get-people function

Clojure For Comprehension 示例

javascript - 如何阅读 es6/javascript 中的函数组合?

c# - 在这种情况下,组合优于继承?

java - 在 Java/Clojure 中将 UTF-32 编码的字符串(C 样式)转换为 UTF-16(JSON 样式)编码的字符串

java - 如何理解码成和转发方式?

c++ - 什么是组合的正确代码生成

Javascript组合如何扩展一个对象