【发布时间】:2015-07-02 09:23:12
【问题描述】:
我有一套这样的功能,
(defn nmf-kernel [a b])
(defn lin-kernel [a b])
(defn log-kernel [a b])
然后像这样的另一组初始化函数,
(defn fill-random
([a b] "filling matrix random")
([a b c] "filling matrix random with another setting parameter"))
好的,我有一个场景:
(defn scenario
[kernel a b c d e f g]
(let [init-fn (if (= kernel nmf-kernel)
(fill-random a b)
(fill-random a b c))))
问题:我怎样才能习惯性地选择一个函数而不是另一个函数?因为当我使用(if (= kernel nmf-kernel)) 时,感觉这种方法并不优雅。而且,当我有 10 个核函数和 10 种填充矩阵的方法时,我该如何设计这个场景?
PS:我在创建内核函数时遇到了同样的问题,但内核函数的答案可能是在 Clojure 中使用协议。
【问题讨论】:
-
我想您可能正在寻找多种方法。
-
什么是
eval-kernel?我的印象是,scenario的kernel参数是您要评估的函数本身?或者它只是一个标志(例如一个符号或关键字)?如果后者使用=与函数nmf-kernel进行比较总是会失败。 -
@Vanessa 嗯,好的,我会检查 defmulti 来设计这些方法,感谢您的帮助:D eval-kernel 永远不存在,我已经编辑了帖子
标签: design-patterns clojure code-reuse