Clojure 为什么';t(into{}x)接受x的序列

Clojure 为什么';t(into{}x)接受x的序列,clojure,Clojure,我有两个相关的问题: 为什么(into{})坚持将向量作为(键、值)对的容器 为什么它试图使用Long,这是对的组成部分,作为对本身?它不应该至少抱怨看到一个非向量,不管它包含什么 顺便说一句,使用Clojure 1.5.1进行测试。进入是在conj之上实现的 => (into {} (for [x [["1" "2"] ["3" "4"]]] (map #(Long/parseLong %) x))) ClassCastException java.lang.Long cannot b

我有两个相关的问题:

  • 为什么
    (into{})
    坚持将向量作为(键、值)对的容器
  • 为什么它试图使用
    Long
    ,这是对的组成部分,作为对本身?它不应该至少抱怨看到一个非向量,不管它包含什么


  • 顺便说一句,使用Clojure 1.5.1进行测试。

    进入
    是在
    conj
    之上实现的

    => (into {} (for [x [["1" "2"] ["3" "4"]]] (map #(Long/parseLong %) x)))
    ClassCastException java.lang.Long cannot be cast to java.util.Map$Entry  clojure.lang.ATransientMap.conj (ATransientMap.java:44)
    
    => (into {} (for [x [["1" "2"] ["3" "4"]]] (seq (map #(Long/parseLong %) x))))
    ClassCastException java.lang.Long cannot be cast to java.util.Map$Entry  clojure.lang.ATransientMap.conj (ATransientMap.java:44)
    
    => (into {} (for [x [["1" "2"] ["3" "4"]]] (vec (map #(Long/parseLong %) x))))
    {1 2, 3 4}
    
    conj
    需要一个映射、映射条目或两元素向量。请参阅以下摘录:

    conj期望另一个(可能是单个条目)映射作为项,并返回一个新映射,该映射是旧映射加上来自新映射的条目,这可能会覆盖旧映射的条目。conj还接受一个MapEntry或两个项(键和值)的向量


    into
    是在
    conj
    之上实现的

    => (into {} (for [x [["1" "2"] ["3" "4"]]] (map #(Long/parseLong %) x)))
    ClassCastException java.lang.Long cannot be cast to java.util.Map$Entry  clojure.lang.ATransientMap.conj (ATransientMap.java:44)
    
    => (into {} (for [x [["1" "2"] ["3" "4"]]] (seq (map #(Long/parseLong %) x))))
    ClassCastException java.lang.Long cannot be cast to java.util.Map$Entry  clojure.lang.ATransientMap.conj (ATransientMap.java:44)
    
    => (into {} (for [x [["1" "2"] ["3" "4"]]] (vec (map #(Long/parseLong %) x))))
    {1 2, 3 4}
    
    conj
    需要一个映射、映射条目或两元素向量。请参阅以下摘录:

    conj期望另一个(可能是单个条目)映射作为项,并返回一个新映射,该映射是旧映射加上来自新映射的条目,这可能会覆盖旧映射的条目。conj还接受一个MapEntry或两个项(键和值)的向量


    回答第二个问题:您正在将一系列序列传递到
    into
    通过重复
    conj
    ing(或
    conj!
    ing,如果可能,结果是等效的)工作。在这里,每一步你都要从你的序列中提取一个项目,并把它连接到地图上。每个这样的项目都是由两个
    Long
    s组成的序列。当您将序列
    conj
    放到映射上时,
    conj
    假定它是一个映射条目序列,并将每个元素强制转换为
    map$Entry

    因此,在这里,它将尝试将
    Long
    转换为
    映射$Entry
    ,以回答第二个问题:您正在将序列传递到
    into
    通过重复
    conj
    ing(或
    conj!
    ing,如果可能,结果是等效的)工作。在这里,每一步你都要从你的序列中提取一个项目,并把它连接到地图上。每个这样的项目都是由两个
    Long
    s组成的序列。当您将序列
    conj
    放到映射上时,
    conj
    假定它是一个映射条目序列,并将每个元素强制转换为
    map$Entry

    因此,在这里,它将尝试将您的
    Long
    s转换为
    Map$Entry

    这实际上也回答了第一个问题。这实际上也回答了第一个问题。