Clojure 中 comp 函数的问题

Trouble with comp function in Clojure

我有 3 个以前的文件,每个文件都有一个函数,我试图在 ex4.clj 中使用 comp 来组合所有 3 个,但我目前收到有关传递的参数数量错误的错误。我试过使用 map、reduce 和 filter,但它们都失败了,我不确定如何判断需要哪个,因为所有函数都使用不同的函数。

ex1.clj

(defn round [input] (Math/round (double input)))

(def testList [4.7 3.3 -17 17 -5.6 -3.3 0])

(def roundedList (map round testList))

ex2.clj

(defn isDivisibleBy [factor]
    (fn [number]
        (def result (/ number factor))
        (def roundedResult (Math/round (double result)))

        (and (= result roundedResult))
    )
)

(def divisibleBy2 (isDivisibleBy 2))

(def testList [2 3 4 17 3000 -3 -6 0])

(def divisibleSuccess (filter divisibleBy2 testList))

ex3.clj

(defn findMax [accum value]
    (if (> accum value) accum value)
)

(def testList [2 3 4 17 3000 -3 0 -3001])
(def maxValue (reduce findMax testList))

ex4.clj(问题文件)

(load-file "ex1.clj")
(load-file "ex2.clj")
(load-file "ex3.clj")

(def testList [4.7 3.3 -17 17 -5.6 -3.3 0])
(def allThree (comp findMax divisibleBy2 round))
(def output ((map/reduce/filter) allThree testList))

(println "Original list: " testList)
(println "Highest rounded number divisible by 2: " output)

谢谢!

你的函数用于不同的工作:一个是谓词, 你想filter一起。一个是改造,你要map 超过。最后一个是聚合,您想用作最后一步 (通过 reduce)。

所以你必须组合你想要做的转换:

((comp
    (partial reduce findMax)
    (partial filter divisibleBy2)
    (partial map round))
  testList)

如果你想做很多,你也应该看看 transducers,允许 这样做没有中间序列的成本。

随机风格点评:

  • Clojure 使用 kebab-case 而不是 camelCase
  • 从不def在命名空间之外;使用 let 代替
  • 谓词通常有尾随 ?(例如 divisible-by-2?