2012-05-12 8 views
9

現在、私はClojureを学習しようとしていますが、可変量のパラメータを持つ関数を記述したいと思います。この関数は、すべての入力をフィルタリングして文字列かどうかをチェックする必要があります。それがない場合は、文字列型のすべての入力が返されるべきである。..フィルタタイプ文字列in Clojure

Clojureのは、思考の私のためにハードと異なる方法ですが、私はここで右方向にしています..私はそれを解決するために見えることはできません。

(defn returnString [& y] 
(if (next y) 
(filter (fn [x] (= (type x) "java.lang.String"))y) 
(recur (next x)))) 

ありがとう!

答えて

11

引数が文字列の場合はtrueを返し、そうでない場合はfalseを返す関数string?があります。 (フィルタ機能は、一連の値(基本的にコレクションを)返しますので、再帰についての必要性の心配がありません

(defn return-strings [& vals] 
    (filter string? vals)) 

=> (string? "hi") 
true 
=> (string? 100) 
false 
=> (string? ["a" "b" "c"]) 
false 

だからこのことを念頭に置いて、あなたの関数は次のようになります。つまり、recurを使用して)この場合のカスタム関数で使用します。


文字列が何であるかを判断するために使用する匿名関数は、正しいものに非常に近いです。あなたのREPLに(source string?)を入力してstring?のソースを見てみるならば、あなたはわかります、あなたが取っているアプローチは、同様に機能するであろう

(fn [x] (instance? String x)) 

が。指定した文字列値の代わりにStringクラスを指定するだけです。 (java.langは、Javaと同じように自動的にパッケージされるため、省略することができます)。

(fn [x] (= (type x) String)) 
関連する問題