2013-06-23 4 views
5

Sto provando a scrivere una funzione che accetta una stringa e restituisce un risultato di una funzione filtro (sto lavorando attraverso i problemi 4clojure). Il risultato deve essere anche una stringa.Clojure join non riesce a creare una stringa dal risultato della funzione filtro

ho scritto questo:

(fn my-caps [s] 
    (filter #(Character/isUpperCase %) s)) 

(my-caps "HeLlO, WoRlD!") 

Result: (\H \L \O \W \R \D) 

Ora sto cercando di creare una stringa di fuori di questa lista, utilizzando clojure.string/unirsi, in questo modo:

(fn my-caps [s] 
    (clojure.string/join (filter #(Character/isUpperCase %) s))) 

Il risultato è comunque lo stesso. Ho anche provato a usare apply str, senza successo.

risposta

3

Prova questo:

(defn my-caps [s] 
    (->> (filter #(Character/isUpperCase %) s) 
     (apply str))) 

filter funzione restituisce una sequenza pigro. Se si desidera ottenere uno string, è necessario trasformare la sequenza in stringa applicando la funzione str.

+0

Grazie! Mi ha fatto cercare una macro a doppia freccia. Prima non conoscevo i thread macro. –

+0

@ntalbs, perché usare l'operatore '- >>' qui? è sufficiente una semplice chiamata di funzione per invocare 'apply' –

+2

@ ÓscarLópez Sì, hai ragione. Il risultato è lo stesso. Tuttavia, l'utilizzo di '- >>' rende più semplice leggere la lettura del codice e digitare a partire dal mio processo di pensiero. Questo è tutto. È una specie di preferenze personali. – ntalbs

4

È necessario convertire la sequenza lazy restituita da filter in una stringa, applicando la funzione str. Inoltre, utilizzare defn per definire una nuova funzione - ecco come:

(defn my-caps [s] 
    (apply str (filter #(Character/isUpperCase %) s))) 

Esso funziona come previsto:

(my-caps "HeLlO, WoRlD!") 
=> "HLOWRD" 
4

L'ultima snippet di codice incollato funziona bene. join restituisce effettivamente una stringa.

+0

Hai ragione. Fino ad ora ho ricaricato il file in REPL, ma solo dopo averlo riavviato, ha funzionato. Il filo però non è stato uno spreco - ho imparato nuovi modi di creare string da una collezione. –

Problemi correlati