如何使用clojure中的map函数打印哈希映射列表的每个元素?

时间:2016-10-07 05:50:41

标签: clojure hashmap

我正在构建一个哈希映射列表,然后传递给另一个函数。当我尝试使用map从列表中打印每个哈希映射时,它无效。我可以打印完整列表或获取第一个元素等。

(defn m [a]
    (println a)
    (map #(println %) a))

以下仅适用于repl。

(m (map #(hash-map :a %) [1 2 3]))

但是从我使用load-file加载的程序中,它无效。我看到的是a,但没有看到它的个别元素。怎么了?

3 个答案:

答案 0 :(得分:4)

在Clojure中,转换函数返回一个惰性序列。所以,(map #(println %) a)返回一个懒惰的序列。使用时,将应用地图操作,然后才能看到打印效果。

如果该功能的目的是产生副作用,例如打印,则需要急切地评估转换。函数dorundoall

(def a [1 2 3])
(dorun (map #(println %) a))
; returns nil

(doall (map #(println %) a))
; returns the collection

如果您实际上不想映射,但只有副作用,则可以使用doseq。它旨在“重复”。做副作用:

(def a [1 2 3])
(doseq [i a]
   (println i))

答案 1 :(得分:4)

如果您的目标只是按顺序调用集合中每个项目的现有函数,忽略返回的值,那么您应该使用run!

(run! println [1 2 3])
;; 1
;; 2
;; 3
;;=> nil

在一些更复杂的情况下,最好使用doseq作为@Gamlor建议,但在这种情况下,doseq只会添加样板。

答案 2 :(得分:0)

我建议使用尾递归:

(defn printList [a]
  (let [head (first a)
        tail (rest a)]
    (when (not (nil? head))
      (println head)
      (printList tail))))