leontalbot
leontalbot

Reputation: 2543

Apply a list of functions to a corresponding list of data in Clojure

So I have a list of functions and a list of data:

[fn1 fn2 fn3] [item1 item2 item3]

What can I do to apply each function to its corresponding data item:

[(fn1 item1) (fn2 item2) (fn3 item3)]

Example:

[str #(* 2 %) (partial inc)]   [3 5 8]

=> ["3" 10 9]

Upvotes: 8

Views: 218

Answers (2)

Michiel Borkent
Michiel Borkent

Reputation: 34800

An alternative, not necessarily better:

user=> (for [[f x] (map vector [neg? pos? number?] [1 2 "foo"])]
  #_=>   (f x))
(false true false)

To make the map version suitable for varargs:

user=> (map (fn [f & args] (apply f args)) [+ - *] [1 2 3] [4 5 6] [7 8 9])
(12 -11 162)

Upvotes: 2

Dogbert
Dogbert

Reputation: 222118

You can use map

(map #(%1 %2) [str #(* 2 %) (partial inc)] [3 5 8])
("3" 10 9)

If you need a vector back, you can (apply vector ...)

(apply vector (map #(%1 %2) [str #(* 2 %) (partial inc)] [3 5 8]))
["3" 10 9]

Disclaimer: I don't know much Clojure, so there would probably be better ways to do this.

Upvotes: 7

Related Questions