簡體   English   中英

不斷Clojure和地圖功能

[英]Clojure constantly and map function

為什么這樣的Clojure代碼:

user=> (map (constantly (println "Loop it.")) (range 0 3))

產生以下輸出:

Loop it.
(nil nil nil)

我希望它可以打印三遍“ Loop it”,這是對該函數進行三遍評估的副作用。

constantly不會多次評估其參數。 它是一個函數,而不是宏,因此該參數在constantly運行之前僅被評估一次。 constantly做的就是獲取其(求值的)參數並返回一個函數,該函數每次調用時都返回給定值(無需重新求值,因為正如我所說,自變量在constantly運行之前就已經被求值了)。

如果您要做的只是為范圍內的每個元素調用(println "Loop it") ,則應將其作為要映射的函數傳遞,而不是constantly 請注意,您實際上必須將其作為函數而不是經過評估的表達式傳遞。

通過反復使用usig和lambda表達式,您可以獲得接近您意圖的行為。

例如:

(repeatedly 3 #(println "Loop it"))

除非您在REPL上,否則它必須被dorun或類似的dorun包圍。 repeatedly是懶惰。

正如sepp2k正確地constantly指出的是一個函數,因此其參數將僅被評估一次。

實現此處操作的慣用方式是使用doseq

(doseq [i (range 0 3)]
  (println "Loop it."))

或者使用dotimes (在這種情況下,它更加簡潔高效,因為您實際上並沒有使用range產生的序列):

(dotimes [i 3]
  (println "Loop it."))

這兩種解決方案都是非惰性的,如果您只是運行一些副作用代碼,那么這可能就是您想要的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM