选择函数而不是另一个函数 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
需要它的键。
如果您选择初始化函数的标准可能会变得更加复杂,那么多方法是可行的方法。但是它们对于仅在另一个功能的基础上选择一个功能来说有点沉重。
我有一套这样的功能,
(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
需要它的键。
如果您选择初始化函数的标准可能会变得更加复杂,那么多方法是可行的方法。但是它们对于仅在另一个功能的基础上选择一个功能来说有点沉重。