Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics 不将集合转换为列表的地图集合_Generics_Collections_Clojure - Fatal编程技术网

Generics 不将集合转换为列表的地图集合

Generics 不将集合转换为列表的地图集合,generics,collections,clojure,Generics,Collections,Clojure,是否可以在不将集合转换为列表的情况下映射集合?我知道向量的mapv,但是集合或映射呢。是否有一个通用的map函数将每个集合视为一个函子(即可映射的对象),并在映射后保留其类型 以下是我的想法和现在发生的事情: (map inc [1 2 3]) ; => [2 3 4], instead I get: (2 3 4) (map inc #{1 2 3}) ; => #{3 2 4}, instead I get: (3 2 4) (map inc {:a

是否可以在不将集合转换为列表的情况下映射集合?我知道向量的
mapv
,但是集合或映射呢。是否有一个通用的
map
函数将每个集合视为一个函子(即可映射的对象),并在映射后保留其类型

以下是我的想法和现在发生的事情:

(map inc [1 2 3])         ; => [2 3 4], instead I get: (2 3 4)
(map inc #{1 2 3})        ; => #{3 2 4}, instead I get: (3 2 4)
(map inc {:a 1 :b 2 :c 3} ; => {:a 2 :b 3 :c 4}, instead I get: ClassCastException

函数的返回值不是精确的列表,这只是它们在打印时在REPL中的表示方式。它们实际上是
clojure.lang.LazySeq
的实例,如下所示:

(class (map inc [1 2 3]))
=> clojure.lang.LazySeq
Clojure尝试将所有集合处理为
可映射的,而不是
可映射的
Seq
抽象允许将许多转换组合到一个集合上的操作管道中,其中维护原始输入类型通常没有意义,特别是在性能(速度)方面。在这种情况下,Clojure的动态特性实际上非常有用

将操作的输出转换为所需的集合类型非常简单:

(-> (map inc [1 2 3])
    (vec))
或者更简单地说,在
中使用

(into [] (map inc [1 2 3]))
进入
可用于列表、地图和集合:

(into #{} (map inc #{1 2 3}))
=> #{4 3 2}
在您尝试映射Hashmap的示例中,
map
clojure.lang.MapEntry
的形式传递一系列键值对,因此需要一个数字的
inc
无法直接处理它

您可以执行类似的操作,使用destructuring提取键和值:

(into {} (for [[k v] {:a 1 :b 2 :c 3}]
           [k (inc v)]))

转换为
函数将任何序列转换为特定类型。要保留原始类型,请将
(空数据)
作为第一个参数传递:

(def data #{1 2 3})
(into (empty data) (map inc data))
;; #{4 3 2}
(空xs)
习惯用法还保留元数据和其他集合属性(例如排序函数)