2017-05-04 4 views
-1
(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 finden:Clojure, kann nicht einen Fehler im Code

Sie wissen nicht, wie iseq erstellen aus: java.lang.Long

Wer weiß, wie sie zu beheben es?

+0

Was ist Ihr Ziel? Versuchen Sie, Ihre eigene Implementierung als Übung zu erstellen, oder möchten Sie eine Funktion, die eine Zusammensetzung von Map Converting Result Seq in eine Menge zurückgibt? –

+0

Ja, das ist Übung in dem Buch Clojure für Mutige. Auch ich möchte nur wissen, was ich falsch gemacht habe, und warum mein Code nicht funktioniert – Hive

+0

PS Entschuldigung für mein Englisch – Hive

Antwort

4

Das erste Problem ist, dass into Sammlungen akzeptiert, keine Sammlung und ein einzelnes Element. Ich glaube, Sie wollten stattdessen conj verwenden:

(conj result (func first-value))

Ein weiteres Problem ist, dass Clojure Sammlungen (result Vektor in diesem Fall) sind unveränderlich so funktioniert wie conj oder into eine neue aktualisierte Sammlung zurückkehren, anstatt ihre Eingangsparameter zu modifizieren, so müssen Sie ihr Ergebnis für recur verwenden:

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

Und das letzte Problem ist, dass Sie + Funktion sind vorbei, die auf ein einziges Argument angewendet wird, wenn w krank es zurückgeben. Ich vermute, dass Sie stattdessen inc verwenden wollten.

So kann Ihr Arbeits Code sollte wie folgt aussehen:

(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}