1

(defmulti multi (fn [t] (cond (seq? t) :seq (map? t) :map (vec? t) :vec ...在这里和那里阅读了很多 Clo​​jure 代码中的模式,这基本上是一个开关(如果我添加一个类型,我必须添加一个新子句)但更冗长。有没有办法说(defmethod seq, (defmethod vec (defmethod map..等?这一定是一件很平常的事情。我知道可以手动定义层次结构,但是常见的 Clojure 类型,如序列、向量、映射......是否必须为每个在 type 上调度的程序定义它们?请告诉我我是如何错过重点的!

编辑:好的,我想我可以说(defmulti mymulti type)然后(defmethod clojure.lang.PeristantSomething...等等,但这很笨拙,因为它指的是java类,但我想指的是“类型”的一些质量,比如它是顺序的还是关联的

4

2 回答 2

3

分派类型适用于此:

user> (import '[clojure.lang Associative Sequential])
user> (defmulti foo type)
#'user/foo

user> (defmethod foo Associative [x] :map)
#<MultiFn clojure.lang.MultiFn@7e69a380>

user> (foo {:x 1})
:map
user> (foo ())
; fails, a list is not associative

user> (defmethod foo Sequential [x] :seq)
#<MultiFn clojure.lang.MultiFn@7e69a380>
user> (foo ())
:seq
user> (foo [])
; fails, a vector is both sequential and associative

user> (prefer-method foo Sequential Associative)
#<MultiFn clojure.lang.MultiFn@7e69a380>
user> (foo [])
:seq

请注意,顺序和关联都是接口而不是具体类。

于 2012-06-09T06:01:01.803 回答
0

选择调度函数是类型还是类。

于 2012-06-09T05:44:32.557 回答