2015-05-12 21 views
1
user=> (map inC#{1 2 3}) 
(2 4 3) 
user=> (into #{} (map inC#{1 2 3})) 
#{4 3 2} 

有沒有辦法將一個函數應用到一個集合並直接返回一個集合?Clojure直接將一套設置映射到另一套設置?

+0

[algo.generic](https://github.com/clojure/algo.generic)提供了'fmap',其中一個實現與您的集合示例非常相似。 AFAIK,沒有任何內置的語言支持這一點。 – Alex

回答

1

稍微更通用的方法來做到這一點是使用empty

(defn my-map [f c] 
    (into (empty c) 
     (map f c))) 

這得到如下結果:

(my-map inC#{1 2 3}) ;; => #{2 3 4} 
(my-map inc [1 2 3]) ;; => [2 3 4] 
(my-map inc '(1 2 3)) ;; => (4 3 2) 

它可以用於其他persistent collections也是如此。

+0

如第三個例子所示,'my-map'在給出一個'seq'時將以相反的順序產生結果。當給定一個'seq'時,'my-map'可能會延遲到'map'。 –

1

正如Alex所說,來自algo.generic的fmap提供了這個功能,儘管如果你看看它的源代碼,它就和你的代碼完全一樣。我建議把你的函數放在你的代碼的util命名空間中,這可能不值得爲一個函數提供一個完整的庫。

1

使用Clojure 1.7.0(仍處於測試階段),你可以使用一個傳感器做到這一點:

(into #{} (map inc) #{1 2 3})