我试图接受一些输入,对其进行计算,然后找到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)
)
答案 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个参数,而这不是你想要对你的向量做的事情。)