2015-03-25 39 views
0

這是對我之前的問題here的擴展。通過一系列函數和一個seq中的其他參數對數據結構進行線程處理

目的被示爲如下:

(defn foo 
    [x a-map] 
    (assoc a-map x "value")) 

(defn -main 
    [x] 
    (let [[x1 x2 x3 ... xn] x] 
    (-> {} 
     (partial foo x1) 
     (partial foo x2) 
     (partial foo x3) 
     ... 
     (partial foo xn)))) 

的這個問題的複雜性在於,我必須填充可變數量的部分功能,所以我不能使用->也不「排版」。 foo函數的真正機制當然不是assoc,所以我不能簡化爲zipmap的問題。

我不確定這個問題,但輸入參數x實際上是兩個序列的笛卡爾乘積。因此,x的每個元素都是一個兩元素向量,它遍歷兩個序列的笛卡爾乘積空間。它使用for循環生成,或者更確切地說是列表理解。

你有什麼建議來處理這個問題?如果我沒有提供一些重要信息,請告訴我。

乾杯

回答

1

首先,你的thread first -> macro使用不正確(參見this question獲取更多信息)。下面是使用thread last ->> macro正確的語法:

(->> {} 
    (foo x1) 
    (foo x2) 
    (foo x3) 
    (foo x4)) 

雖然,它不會工作,除非矢量x的長度是威懾。

但是你可以使用reduce function這裏來處理元素的任意序列:

(reduce #(assoc %1 %2 "value") {} x) 

下面是一個完整的例子(與重新定義了foo功能):

(defn foo 
    [a-map x] ; reversed order of arguments 
    (assoc a-map x "value")) 

(defn -main 
    [x] 
    (reduce foo {} x)) 
+0

美麗!關於我的雙重循環嵌套方式,在真正的數據操作習慣之前是否構建了一個笛卡爾seq?或者有什麼其他的選擇來做到這一點? – Davyzhu 2015-03-25 08:24:42

+0

在將它提供給'reduce'之前,用'for'循環構建一個笛卡爾積是一個很好的解決方案,因爲'for'產生一個懶惰的序列。但請確保不要持有產生懶惰序列的頭。 – 2015-03-25 08:30:49

+0

但你爲什麼提到嵌套'for'循環?在Clojure中,只需一個'for'循環即可生成笛卡爾產品。 – 2015-03-25 08:31:44

相關問題