Types 为了保持输出类型的惯用性,(into)是否进行了更高级的推理?

Types 为了保持输出类型的惯用性,(into)是否进行了更高级的推理?,types,clojure,set,clojurescript,enumerable,Types,Clojure,Set,Clojurescript,Enumerable,假设我有一个不可知论定义为键值映射的键值对: (def foo {:bar "baz" :bat "squanch"}) 我后来想对它进行一些集合操作,所以我需要将它转换为一个关系,Clojure备忘单上说它是集合的一种类型,所以我继续抓取(into),然后转到它: (set/project (into #{} foo) [:bar]) #{{}} 嗯 这根本不是(项目)所期望的。根据: 如此接近 我应该期望(into)知道我转换成这些类型时的意思,还是有其他方法?如果是这样的话,我也可以通

假设我有一个不可知论定义为键值映射的键值对:

(def foo {:bar "baz" :bat "squanch"})
我后来想对它进行一些集合操作,所以我需要将它转换为一个关系,Clojure备忘单上说它是集合的一种类型,所以我继续抓取
(into)
,然后转到它:

(set/project (into #{} foo) [:bar])
#{{}}

这根本不是
(项目)
所期望的。根据:

如此接近

我应该期望
(into)
知道我转换成这些类型时的意思,还是有其他方法?如果是这样的话,我也可以通过几个map/flant调用来实现我自己的东西,但这正是我试图通过使用更优雅的集合语言来避免的

为清楚起见,以下是一个我认为最好使用
(set/project)
来完成的示例,但在上述期望下似乎不可能:

(defn exclude-keys "Filters out all but argument-provided keys from a key-value
  map."
  [input-map excluded-keys]
  (-> input-map (select-keys (set/difference (into #{} (keys input-map))
                                              excluded-keys))))

我想我只是感到惊讶,在Clojure中需要这么多额外的语法才能完成。

进入
只是
将序列的元素连接到给定的集合中,例如

(into #{} [:a :b :b :c :a])
=> #{:c :b :a}
因为映射是成对的序列,所以在输入映射中会有一组对

如果您只想从地图中删除一组密钥,可以使用
dissoc

(defn exclude-keys "Filters out all but argument-provided keys from a key-value
  map."
  [input-map excluded-keys]
  (apply dissoc input-map excluded-keys))

不清楚您想做什么,也不清楚您希望
做什么
into
just
conj
s将序列中的元素合并到给定集合中。因为映射是成对的序列,所以在输入映射中会有一组对。@Lee我想这是一个单独的表达式,但是像
项目
示例中的对象这样明显经过精心剪裁的对象是什么时候出现的呢?我本来希望
进入#{}
会给我一些clojure备忘单关系部分中的所有函数都可以合理操作的东西;地图由地图条目组成。如果您想将有关
(into)
功能的注释粘贴到中,我将接受此答案并将其关闭。我喜欢这个成语。
(into #{} [:a :b :b :c :a])
=> #{:c :b :a}
(defn exclude-keys "Filters out all but argument-provided keys from a key-value
  map."
  [input-map excluded-keys]
  (apply dissoc input-map excluded-keys))