我一直在努力找出一个用参数评估表单集合的方法。
示例功能:
(defn x
[a b c]
(+ a b c))
我想评估函数x的集合,其中只定义了一些参数,并传递了其他参数,最后得到了集合中x函数求值的产品列表:
(defn y
[z]
(map #(eval %) [(x z 1 1) (x z 2 2) (x z 8 64)]))
问题是:当我将eval映射到每个函数时,如何将z作为参数引入集合中的每个函数?这可能吗?
我试图避免将它们全部输入,因为我有许多输入(数百个)我想传递给x,其中我只有一小部分我关心的第二和第三个参数(五个左右)。
有没有更好的方法来实现这一目标?
谢谢!
答案 0 :(得分:3)
首先,让我们使用更多解释性名称,简化x
的定义,而不是使用eval
:
(defn sum [& xs]
(apply + xs)) ;; could be inlined instead of a function
(defn sum-with [z]
(map (partial apply sum)
[[z 1 1]
[z 2 2]
[z 8 64]]))
(sum-with 3)
=> (5 7 75)
但是我认为你的真实世界问题比求和数更复杂,所以我假设你的x
函数正在做其他事情并需要一些位置参数,即顺序争论很重要:
(defn transmogrify [this n1 n2 that]
(+ n1 n2 (* this that)))
(defn evaluate-sums [a b]
(map (partial apply transmogrify)
[[a 1 1 b]
[a 2 2 b]
[a 8 64 b]]))
(evaluate-sums 3 9)
=> (29 31 99)
因此,如果我理解正确,您可以通过apply
函数的参数序列来实现目标。或者更明确地使用args /不使用apply
,只需使用map
更具体的匿名函数:
(defn evaluate-sums [z]
(map (fn [[this n1 n2 that]]
(transmogrify this n1 n2 that))
[[z 1 1 99]
[z 2 2 360]
[z 8 64 -1]]))
我试图避免将它们全部输入,因为我有许多输入(数百个)我想传递给x,其中我只有一小部分我关心的第二和第三个参数(五个左右)。
如果你的“固定”参数总是相同的,那么你可以使用variadic arity作为参数的 rest :
(defn sum [a b & cs]
(apply + a b cs))
(defn evaluate-sums [zs]
(map (fn [[a b & cs]]
(apply sum a b cs))
[[1 1 zs]
[2 2 zs]
[8 64 zs]]))
zs
是额外参数的集合/序列。