2013-01-17 60 views

回答

2

clojure.set/project來源:

(defn project 
    "Returns a rel of the elements of xrel with only the keys in ks" 
    {:added "1.0"} 
    [xrel ks] 
    (set (map #(select-keys % ks) xrel))) 

你需要實現自己的project無需轉換結果爲set

(defn my-project [xrel ks] 
    (map #(select-keys % ks) xrel)) 

測試:

(my-project (map #(hash-map :number % :square %) 
       (range 100)) 
      #{:square}) 
=> ({:square 0} 
    {:square 1} 
    {:square 2} 
    {:square 3} 
    ... 
    {:square 99}) 

更新。另一個版本:

(defn my-project2 [xrel ks] 
    (map (fn [m] (into {} (filter #(ks (key %)) m))) 
     xrel)) 
+0

..這引出了一個問題:在庫中使用set有什麼好處?對我來說,由於相同的鍵僅被表示一次,所以投影的結果可能具有不同的計數。 –

+0

@MarcusJuniusBrutus直到你問起,我纔看過這個函數。我只能假設它是因爲'project'是'clojure.set'的一部分,它被設計用來處理sets(?)。 – mobyte

+0

'clojure.set'的目的是作爲一個輕量級的實現關係代數與代表關係的地圖集合一起工作。請參閱[本博客文章](http://www.lshift.net/blog/2010/08/21/some-relational-algebra-with-datatypes-in-clojure-12)以獲取概述。 '項目'旨在與'join','select'等配合使用。 –