user=> (map inC#{1 2 3})
(2 4 3)
user=> (into #{} (map inC#{1 2 3}))
#{4 3 2}
有沒有辦法將一個函數應用到一個集合並直接返回一個集合?Clojure直接將一套設置映射到另一套設置?
user=> (map inC#{1 2 3})
(2 4 3)
user=> (into #{} (map inC#{1 2 3}))
#{4 3 2}
有沒有辦法將一個函數應用到一個集合並直接返回一個集合?Clojure直接將一套設置映射到另一套設置?
稍微更通用的方法來做到這一點是使用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也是如此。
如第三個例子所示,'my-map'在給出一個'seq'時將以相反的順序產生結果。當給定一個'seq'時,'my-map'可能會延遲到'map'。 –
正如Alex所說,來自algo.generic的fmap提供了這個功能,儘管如果你看看它的源代碼,它就和你的代碼完全一樣。我建議把你的函數放在你的代碼的util命名空間中,這可能不值得爲一個函數提供一個完整的庫。
使用Clojure 1.7.0(仍處於測試階段),你可以使用一個傳感器做到這一點:
(into #{} (map inc) #{1 2 3})
[algo.generic](https://github.com/clojure/algo.generic)提供了'fmap',其中一個實現與您的集合示例非常相似。 AFAIK,沒有任何內置的語言支持這一點。 – Alex