2013-06-23 11 views
5

文字列を受け取り、フィルタ関数の結果を返す関数を作成しようとしています(私は4clojureの問題を解決しています)。結果も文字列でなければなりません。フィルタ関数の結果から文字列を作成できません

私はこれを書いている:

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

結果:

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

(my-caps "HeLlO, WoRlD!") 

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

は今、私はこのように、参加/ clojure.stringを使用して、このリストから文字列を作成しようとしていますしかし同じです。私もapply strを使ってみましたが、成功しませんでした。

答えて

3

これを試してみてください:

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

filter機能は怠惰なシーケンスを返します。 stringを取得する場合は、str関数を適用してシーケンスを文字列に変換する必要があります。

+0

ありがとうございます!それは私に二重矢印スレッドマクロを見させました。私は前にスレッドマクロについて知りませんでした。 –

+0

@ntalbsなぜここで ' - >>'演算子を使うのですか?単純な関数呼び出しは 'apply'を呼び出すのに十分です。 –

+2

@ÓscarLópezはい、そうです。結果は同じです。しかし、 ' - >>'を使うと、コードの読み込みを読みやすくし、思考プロセスとして入力するのが簡単になります。それでおしまい。それは個人的な好みのようなものです。 – ntalbs

4

str関数を適用して、filterによって返されたレイジーシーケンスを文字列に変換する必要があります。また、新しい関数を定義するためにdefnを使用 - ここに方法は次のとおりです。期待どおりに動作します

​​

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

あなたが貼り付けスニペット最後のコードは正常に動作します。 join実際には文字列を返します。

+0

あなたはそうです。今まで私はREPLにファイルをリロードしていましたが、実際にそれを再起動した後でしか動作しませんでした。スレッドは無駄ではありませんでした - コレクションから文字列を作成する新しい方法を学びました。 –

関連する問題