选择函数而不是另一个函数 Clojure

Choosing function over another function Clojure

我有一套这样的功能,

(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 中使用协议。

如果我没看错的话,你有许多可能的 内核函数 ,并且 - 对于其中的每一个 - 一个对应的 初始化函数 .

函数就是值,所以可以做个图:

(def kernel->initialization {nmf-kernel (fn do-something [& _] "Hello")
                             lin-kernel (fn do-something-else [& _] "world!")
                             ; ...
                             })

...您可以使用它来选择合适的初始化:

((kernel->initialization nmf-kernel) "blah" "blah" "blah")
; => "Hello"

通常情况下,您会使用 case form 来处理这类事情。但它不起作用 - 函数不是 编译时 文字,case 需要它的键。


如果您选择初始化函数的标准可能会变得更加复杂,那么多方法是可行的方法。但是它们对于仅在另一个功能的基础上选择一个功能来说有点沉重。