【发布时间】:2011-11-18 08:53:59
【问题描述】:
Clojure 如此强大的部分原因在于所有核心数据类型都实现了相同的序列抽象:clojure.lang.ISeq。
这意味着“first”、“concat”、“cons”、“map”、“rest”等函数一般适用于所有这些数据类型。
我的问题是:如何将我自己的自定义函数添加到组合中,并让它适用于从 ISeq 扩展的所有类型?
第一次尝试是定义我自己的协议,然后是“(extend-type clojure.lang.ISeq ...”,但这不起作用(它会编译但不会将行为添加到实际类型中) . 另一个想法是编写一个宏,在所有 Clojure 类型(PersistentHashMap、PersistentList 等)上显式执行“扩展类型”,但这似乎很麻烦。
是否有任何优雅/惯用的方式来做到这一点?也许是多种方法?
【问题讨论】:
标签: clojure polymorphism abstraction