【问题标题】:How to extend priority map to be reducable如何将优先级映射扩展为可简化
【发布时间】:2012-08-28 17:47:26
【问题描述】:

我注意到priority map 没有实现reduce(如果你尝试,则为AbstractMethodError) - 我该如何扩展它以便它可以?

【问题讨论】:

  • (reduce fn (seq (priority-map ...))?
  • 这就是如何使用它来减少,但我想扩展优先级映射,以便它可以在现有的减少表达式中使用,而不需要他们知道它是一个优先级映射

标签: clojure extend reduce


【解决方案1】:

这对我有用:

(ns reducing
   (:use clojure.data.priority-map)
   (:import (clojure.data.priority_map PersistentPriorityMap)))

(extend-type PersistentPriorityMap
   clojure.core.protocols/CollReduce
   (coll-reduce
      ([this f] (reduce f (seq this)))
      ([this f val] (reduce f (seq this) val))))

(def p (priority-map :a 2 :b 1 :c 3 :d 5 :e 4 :f 3))

(reduce conj [] p)

【讨论】:

  • 将此标记为已接受的答案,因为这是我的想法,但 amalloy 的补丁同样有用
【解决方案2】:

这是由 clojure.core 对集合实现的一些隐含假设引起的,据我所知,这些假设在任何地方都没有编码。具体来说,它假设所有的 java 集合接口也都实现了,但实际上并没有扩展这些接口。因此,可能会忘记实现其中的一些,然后让事情正常工作,直到你得到一些假设它们已实现的代码。

在这种情况下,遗漏的接口(或至少其中一个)是 Iterable:reduce 可以在任何 Iterable 上工作,而无需了解更多信息。我将看到如何应用补丁以使优先级映射实现 Iterable。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多