2016-10-07 18 views
0

我正在構造一個哈希映射列表,然後傳遞給另一個函數。當我嘗試使用map從列表中打印每個哈希映射時,它不起作用。我可以打印完整列表或獲得第一個元素等。如何使用clojure中的map函數打印哈希映射列表的每個元素?

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

以下作品僅適用於repl。

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

但是從我加載的程序使用load-file它不起作用。我看到了a,但沒有看到它的個別元素。怎麼了?

+0

你什麼錯誤?你能用小代碼示例演示嗎? –

+0

有時它打印結果,其他時間只給零。 'doall'正在工作。 – boring

+0

'(map#(println%)a)'只是'(map println a)'。 – Thumbnail

回答

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)) 
+0

請注意,您也可以使用不是懶惰的函數'mapv',並始終將其結果返回給一個向量。 –

+1

'println'返回'nil',所以你想'dorun',而不是'doall'。 – Thumbnail

4

如果你的目標很簡單,就是呼籲每一個項目的現有功能的集合,從而,忽略了返回值,那麼你應該使用run!

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

在一些更復雜的情況下,可能優選的是使用作爲doseq表明@Gamlor,但在這種情況下,doseq只增加樣板。

+0

不,我需要返回值。 – boring

+0

@kadaj那麼你爲什麼接受加洛的回答呢?他的'dorun'和'doseq'解決方案就像我的'run!'解決方案返回'nil',他的'doall'解決方案只是返回一系列'nil'值,我無法想象它會有用。你能解釋一下你的意思嗎? –

+0

問題中的代碼是一個示例。我正在調用返回期貨清單的函數。然後當我應用'(map deref xs)'它不起作用,但'(doall(map deref xs))'工作。 – boring

0

我建議使用尾遞歸:

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