是否有反向映射功能?

时间:2012-04-06 13:36:52

标签: clojure

在clojure中,您可以将函数映射到值序列。是否有内置函数将单个值作为参数映射到函数序列?

(map inc [1 2 3 4])
; -> (2 3 4 5)

(reverse-map [inc dec str] 1)
; -> (2 0 "1")

(reverse-map [str namespace name] :foo/bar/baz)
; -> (":foo/bar/baz" "foo/bar" "baz")

3 个答案:

答案 0 :(得分:9)

juxt有点类似。它需要许多函数并返回一个将其参数传递给每个函数并返回返回值向量的函数。所以:

> ((apply juxt [inc dec str]) 1)
[2 0 "1"]

主要区别在于它创建了一个向量,当然是渴望(即不是懒惰)。原始map创建了一个懒惰的序列。

juxt也适用于具有多个参数的函数:

> ((apply juxt [* / -]) 6 2)
[12 3 4]

答案 1 :(得分:5)

不确定是否有,但实施相当容易:

(def reverse-map (fn [l value] (map #(% value) l)))

答案 2 :(得分:2)

如果不需要懒惰,我会说使用juxt,特别是因为它的组合能力。但是,使用map和repeat的多边形函数的反向映射的简单版本(它们都是惰性的)看起来像这样:

(defn reverse-map
  [fcoll & args]
  (map apply fcoll (repeat args)))

=> (reverse-map [inc dec str] 1)
(2 0 "1")
=> (reverse-map [* / -] 6 2)
(12 3 4)

好的,只是为了提出一个想法,这是一个与juxt具有相同可组合性的版本。它甚至似乎be lazy

(defn lazy-juxt
  [& funs]
  (fn [& args]
    (map apply funs (repeat args))))

=> ((juxt inc dec str) 1)
[2 0 "1"]
=> ((lazy-juxt inc dec str) 1)
(2 0 "1")

=> ((juxt * / -) 6 2)
[12 3 4]
=> ((lazy-juxt * / -) 6 2)
(12 3 4)