使用向量

时间:2015-06-13 20:24:29

标签: clojure

假设我有一个函数f接受两个参数 x & ý。我还有一个由 x 1 x 2 元素组成的向量 X , ... x n

如何编写函数g,其中 g X y )调用 f x 的em>( x i y )?

进一步说明:我希望g返回一个向量,其中每个元素都存储 f 的结果( x i y )。我的理解是,我应该考虑mapmapv

3 个答案:

答案 0 :(得分:2)

您可以使用map来实施它。

我在这里使用lambda表达式来定义一个只接受一个参数的函数。

(defn f [x y ] (...) )
// apply f x y to every element of xs 
// in order to do this we need a function which takes only one argument the x_i and takes the second argument from somehere else - the second argument of g 
// that's what the lambda \x -> f x y does - in short form.
(defn g [xs y] (map (fn [x] (f x y)) xs))

例如

(def X [1 2 3 4])
(defn f [x y] (* x y))
(g X 3)
;=> (3 6 9 12)

答案 1 :(得分:1)

如果您可以重新排列f的定义,以便y是第一个参数,则可以这样做:

(defn f [y x] ...)
(map (partial f y) xs)

partial会返回一个函数,其中y是"烘焙在"作为f的第一个参数。对于带有两个以上参数的函数,可以将其他参数传递给partial,并且返回的函数将接受任何尚未填充的参数的参数。

答案 2 :(得分:0)

以下是使用for的简单方法:

(def y 5)
(def xx (range 5))  ;=> [0 1 2 3 4]
(defn ff [x y] (+ y (* x x)))
(defn gg [xx y] (for [x xx] (ff x y)))
(gg xx y)
;=> (5 6 9 14 21)

您也可以使用repeat

(defn g2 [xx y] (mapv ff xx (repeat y)))
(g2 xx y)
;=> [5 6 9 14 21]