如何在Clojure中对地图矢量使用map函数

时间:2019-06-12 02:05:58

标签: vector clojure functional-programming compojure compojure-api

你们好吗? 我对Clojure相当陌生,并且遇到了我认为很容易解决的问题,但似乎无法掌握。 我有一种在方形板上生成坐标矢量的方法。运行该功能的结果是

形式
 [{:x 1, :y 0} {:x 0, :y 1} {:x 2, y:3} {:x 3, :y 4}]

运行此功能后,我需要对以上结果应用另一个功能。由于我会在集合上映射一个函数,因此我认为使用map函数是合适的。因此,我编写了以下方法:

(defn attack [x y]  (map (fn [coord] (println (get coord :x))) [{:x 1, :y 0} {:x 0, :y 1}]))

(我也尝试了使用get-in而不是get的上述示例,但无济于事)

这不是方法的最终形式,而是我试图查看的结果,至少在运行后是否可以看到打印到终端的内容

clojure myscript.clj

但是,没有任何结果,无论是否从fn函数返回值都无关紧要。例如,此

(defn attack [x y]  (map (fn [coord] coord) [{:x 1, :y 0} {:x 0, :y 1}]))

也不会返回任何内容。有谁知道我至少可以访问我的fn函数中向量内部的值?

最后,这是否会影响我的矢量是否是通过调用另一个函数生成的? 例如,

(defn attack [x y]  (map (fn [coord] coord) (get-attack-coordinates x y)))

这会是一个问题吗?我猜不是,但我认为以防万一是个好主意。 谢谢大家阅读:)

2 个答案:

答案 0 :(得分:2)

(map f xs) 总是返回某些内容。不可能没有。如果您认为不正确,那是因为您的衡量方式有问题,而不是您的map通话存在问题。包括有关程序结构的更多代码,而不仅仅是这一片段。

答案 1 :(得分:2)

map在这种情况下确实会返回

(map (fn [coord] coord) [{:x 1, :y 0} {:x 0, :y 1}])
;; => ({:x 1, :y 0} {:x 0, :y 1})

请注意,在这种情况下:

(map (fn [coord] (println (get coord :x))) [{:x 1, :y 0} {:x 0, :y 1}])

它将首先打印1,然后打印0,然后返回

(nil nil)

因为println返回nil

此外,如果您想访问xy,还可以使用destructuring

(map (fn [{:keys [x y]}] [x y]) [{:x 1, :y 0} {:x 0, :y 1}])

请注意,我在REPL中尝试了以下方法:

The REPL