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?
)
我有 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?
)