Clojure,在代码

时间:2017-05-04 19:30:05

标签: clojure

(defn mapset [func ele]
  (loop [elements ele
         result []]
    (if (empty? elements)
     (set result)
     (let [[first-value & another] elements]
       (into result (func first-value))
       (recur another result)))))
(def v [1 2 3 4 5])
(mapset + v)

Exeption:

  

不知道如何创建ISeq:java.lang.Long

谁知道如何解决?

1 个答案:

答案 0 :(得分:4)

第一个问题是into接受集合,而不是集合和单个元素。我想您想要使用conj代替:

(conj result (func first-value))

另一个问题是Clojure集合(在这种情况下为result向量)是不可变的,因此像conjinto这样的函数会返回一个新的更新集合,而不是修改它们的输入参数,因此您需要将结果用于recur

(recur another (conj result (func first-value)))

最后一个问题是你传递+函数,当应用于单个参数时,它将返回它。我想您想要使用inc

因此,您的工作代码应如下所示:

(defn mapset [func ele]
  (loop [elements ele
         result []]
    (if (empty? elements)
      (set result)
      (let [[first-value & another] elements]
        (recur another (conj result (func first-value)))))))
(def v [1 2 3 4 5])
(mapset inc v)
;; => #{4 6 3 2 5}