map - Clojure reducer 库 - 最大折叠

标签 map clojure reduce reducers

我正在尝试将以下示例转换为新的 Clojure 1.5 reducers 库:

(reduce max (map inc (range 10))) 
;=> 10

当我更改它时 - 我收到以下错误:
(r/fold max  (r/map inc (range 10)))
;ArityException Wrong number of args (0) passed to: core$max  clojure.lang.AFn.throwArity (AFn.java:437)

有人可以给我一个正确的解决方案吗?

最佳答案

请注意,当您替换 max 时它会起作用。与 + .

(r/fold + (r/map inc (range 10)))
; => 55

不同之处在于unlike + max does not have一个没有参数的调用案例。 r/fold需要组合函数——即max — 在不带参数的情况下调用时提供标识值。对于 *它是 1 , 为 +它是 0 .

一个潜在的解决方案是定义一个 max'充当 max但是当不带参数调用时,它返回负无穷大— an identity elementmax功能。
(defn max'
  ([] Double/NEGATIVE_INFINITY)
  ([& args] (apply max args)))
(r/fold max'  (r/map inc (range 10)))
; => 10

使用 r/monoid 可以获得相同的结果功能。
(r/fold (r/monoid max #(Double/NEGATIVE_INFINITY)) (r/map inc (range 10)))

如需进一步讨论,请参阅 Reducers - A Library and Model for Collection Processing ,节简单就是机会。

关于map - Clojure reducer 库 - 最大折叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14192211/

相关文章:

python - 从 2 元组列表创建字典

python - 这个函数必须使用 reduce() 还是有更多的 pythonic 方式?

java - Gson反序列化为 map

reflection - 在运行时导入脚本

clojure - 如何在Clojure中找到此向量的最小成员的索引?

opengl - Clojure 运行时编辑代码拆分为不同的文件

loops - clojure 中的顽固循环,让不被评估

python - 如何在 python 中通过比较映射 2 个列表

r - ggsubplot (ggplot2) 中的饼图

c++ - 为什么没有 boost::intrusive::map?