Age*_*uid 6 polymorphism abstraction clojure
Clojure的一部分功能在于,所有核心数据类型都实现了相同的序列抽象:clojure.lang.ISeq.
这意味着像"first","concat","cons","map","rest"等函数一般在所有这些数据类型上工作.
我的问题是:如何将自己的自定义函数添加到混合中,并使其适用于从ISeq扩展的所有类型?
第一次尝试是定义我自己的协议,然后"(扩展类型clojure.lang.ISeq ...",但这不起作用(它编译但不会将行为添加到实际类型).另一个想法是编写一个宏,在所有Clojure类型(PersistentHashMap,PersistentList等)上显式地执行"扩展类型",但这似乎是kludgey.
有没有优雅/惯用的方式来做到这一点?多方法也许?
你究竟想做什么?
如果您正在尝试向现有类型添加行为:编写处理seqs的常规函数或使用多方法或extend执行您想要的操作.
此外,需要注意的是,大多数Clojure"序列"类型(向量,集合,映射)本身并不是序列(它们没有实现clojure.lang.ISeq),因此clojure.lang.ISeq如果您希望支持它们,则必须做的不仅仅是添加.
| 归档时间: |
|
| 查看次数: |
608 次 |
| 最近记录: |