Clojure使用map来存储结果和参数

时间:2014-10-19 23:27:29

标签: clojure

我试图接受一些输入,对其进行计算,然后找到min,并获取创建该min的参数。

alist = [1 2 3 4 5 -4]

; I want [[1 -1] [2 -2] [3 -3]]
; the following doesn't work.  how can i make it work?
(map #( [% (* -1 %)])  [ 1  2 3])

它也可以是一个散列图,用于存储结果 这应该是荒谬的,但我不能让它发挥作用。我的列表也是一个懒惰的序列,所以我不能用原始列表压缩结果。

; this doesn't work cause alist is a lazy-seq in my program
(let [results (map #(* -1 %) alist)]
    (map vector alist results)
)

1 个答案:

答案 0 :(得分:2)

有很多方法可以做到这一点:

(map (juxt identity #(* -1 %)) [1 2 3])

(for [i [1 2 3]] [i (* i -1)])

(let [s [1 2 3] result (map #(* -1 %) s)] (map vector s result))

(map (fn [i] [i (* i -1)]) [1 2 3])

尽管您声称相反,但使用let绑定和两次调用map的版本在lazy-seq上运行正常。尽管如此,这是从这些例子中做到最不明确的方式。

说明匿名函数错误的原因:

user> '#( [% (* -1 %)])
(fn* [p1__17065#] ([p1__17065# (* -1 p1__17065#)]))

读者将#([% (* -1 %)])扩展为对两元素向量的函数调用,不向该函数调用提供任何参数。这当然是一个错误(当用作函数时,向量应该使用1或2个参数,而这不是你想要对你的向量做的事情。)