2011-04-13 74 views
2

我已經開始學習clojure了,但是我在圍繞某些概念包裝時遇到了麻煩。例如,我想在這裏做的是採取這個功能,並將其轉換,以便它懶惰地調用get-origlabels。在clojure懶洋洋地構建套裝

(defn get-all-origlabels [] 
    (set (flatten (map get-origlabels (range *song-count*))))) 

我使用遞歸,但第一次嘗試炸燬了堆棧(歌曲數大約爲10000)。我無法弄清楚如何用尾遞歸來做到這一點。

get-origlabels在每次調用時都會返回一個集合,但值之間往往會在調用之間重複。 get-origlabels函數實際上做的是讀取一個文件(對於0到song-count -1中的每個值,都有一個不同的文件),並將其中存儲的單詞返回到一個集合中。

任何指針將不勝感激!

謝謝! -Philip

回答

1

這可能有更好的堆棧行爲

(defn get-all-origlabels [] 
    (reduce (fn (s x) (union s (get-origlabels x))) ${} (range *song-count*))) 
7

你可以得到你想要的東西通過mapcat。我相信,把它變成一個實際的Clojure集要取消lazify它,用事實作爲證明(take 10 (set (iterate inc 0)))嘗試服用10

(distinct (mapcat get-origlabels (range *song-count*))) 

這會給你一個懶惰的序列之前實現整個集。您可以驗證通過做這樣的事情,首先是一個無限序列:

(->> (iterate inc 0) 
    (mapcat vector) 
    (distinct) 
    (take 10)) 

你會用一個序列,而不是一組結束了,但因爲它聽起來像你真的想在這裏懶惰,我認爲這是爲了最好。

+0

嗨,謝謝,我不認爲它會變得如此簡單! – Philip 2011-04-13 02:25:51

+0

+1用於解釋該集合「去拉斯化」序列。現在我們迫切需要一個動詞。 – Leonel 2011-04-13 03:14:04

+1

「要認識到」序列是這個標準動詞;我似乎已經懶惰回憶它:) – trptcolin 2011-04-13 03:47:50

1

我可能會使用類似:

(into #{} (mapcat get-origlabels (range *song-count*))) 

一般情況下,「進」構建Clojure的數據結構時是非常有用的。我有一個傳送帶(一個序列)將一堆隨機物體放入一個大桶(目標集合)中的心理圖像。

相關問題