2011-08-11 14 views
2

Clojureでこれを行うより良い方法はありますか?単数形やコレクションを受け入れるためにマップ

(if (coll? coll) 
    (map my-fn coll) 
    (my-fn coll) 

入力collに適用されます。 collは、単数形でもコレクション形式でもかまいません。

coll?をチェックしないと、mapだけを使用すると、xxxからISeqを作成する方法がわからないため、IllegalArgumentExceptionがスローされます。

答えて

4

あなたのコードは大丈夫です(実際にはコレクションであるかどうかわからないので変数collの名前を変更しますが、これは読者を混乱させる可能性があります)。

しかし、このコード全体がコードの匂いに似ているように思われます。ダイナミックなタイピングはあまりにも遠すぎます/私の意見ではあまりにも賢いことをしようとしています: "cleverness considered harmful"の意味です。

  • あなたが実際にコレクションのようにすべてを扱いたい場合は、それらを最初に続いて長さ1のリスト/ベクトルあなたの残りの部分で得られた場合、特異な入力値をラップ:考慮すべき

    代替のアイデアコードは安全にコレクション全体を引き継ぐことができます。

  • コレクションと単一の値を扱う別々の関数を記述します。その根拠は、概念的に異なるデータ型であるため、異なる治療を受ける必要があるということです。
1

collは、ネストされたシーケンスが含まれていない場合:

(map my-fn (flatten (list coll))) 
1

をはリストを受け取り、リストを返す関数とすることができるので、一般的な解決策は、存在しないことができます。それで、入力を検査して、それをマップするかどうかを決めることはできません。

あなたが持っているデータの種類がわからないというシナリオに陥ることはありませんが、プログラムについて詳しく知ることなく、具体的なアドバイスはできません。

+0

実際にはincanter.statsの定型文です –

関連する問題