将集合中的值作为函数的第一个参数传递

时间:2018-08-20 08:42:11

标签: clojure

假设我有一个用户ID集合,即[001 002 003],然后我有一个函数可以执行某些操作,并且需要用户ID作为其第一个参数。

(defn some-function [user-id name e-mail] (do-something user-id name e-mail))

我想做的是使用这个“ some-function”来遍历用户ID的集合,以便它只会更改用户ID参数,而其他参数将保持不变,即它将返回以下内容:

=>

[(some-function 001 name e-mail) (some-function 002 name e-mail) (some-function 003 name e-mail)]

这里有帮助吗? :)谢谢!

2 个答案:

答案 0 :(得分:4)

您可以只使用map

(map #(some-function % name email) user-ids)

答案 1 :(得分:0)

如果“做某事”有副作用,那么您应该使用doseq而不是map

(def user-ids [1 2 3])
(def email "me@my.com")
(def named "me")

(defn some-function [id name email]
  (println (str id ", " name ", " email)))

(doseq [user-id user-ids]
  (some-function user-id named email))

“做某事”通常意味着以某种方式影响世界-从印刷到屏幕到将火箭发射到太空。

但是,如果您想返回一系列可以在以后执行的功能,那么map就可以了:

(def fns (map (fn [id]
                (fn []
                  (some-function id named email)))
              user-ids))

fns是您在问题中写出的数据结构。

要真正执行这些“ thunk”,您仍然需要doseq

(doseq [f fns]
  (f))

作为一个旁注,您所谈论的函数的类型在不同时间接受不同的参数,通常被描述为“高阶函数”,最好从一开始就以这种方式进行编码:

(defn some-function-hof [name email]
  (fn [id]
    (println (str id ", " name ", " email))))

(def some-fn! (some-function-hof named email))