Clojureでこれを行うより良い方法はありますか?単数形やコレクションを受け入れるためにマップ
(if (coll? coll)
(map my-fn coll)
(my-fn coll)
入力coll
に適用されます。 coll
は、単数形でもコレクション形式でもかまいません。
coll?
をチェックしないと、map
だけを使用すると、xxxからISeqを作成する方法がわからないため、IllegalArgumentExceptionがスローされます。
Clojureでこれを行うより良い方法はありますか?単数形やコレクションを受け入れるためにマップ
(if (coll? coll)
(map my-fn coll)
(my-fn coll)
入力coll
に適用されます。 coll
は、単数形でもコレクション形式でもかまいません。
coll?
をチェックしないと、map
だけを使用すると、xxxからISeqを作成する方法がわからないため、IllegalArgumentExceptionがスローされます。
あなたのコードは大丈夫です(実際にはコレクションであるかどうかわからないので変数collの名前を変更しますが、これは読者を混乱させる可能性があります)。
しかし、このコード全体がコードの匂いに似ているように思われます。ダイナミックなタイピングはあまりにも遠すぎます/私の意見ではあまりにも賢いことをしようとしています: "cleverness considered harmful"の意味です。
代替のアイデアコードは安全にコレクション全体を引き継ぐことができます。
coll
は、ネストされたシーケンスが含まれていない場合:
(map my-fn (flatten (list coll)))
をはリストを受け取り、リストを返す関数とすることができるので、一般的な解決策は、存在しないことができます。それで、入力を検査して、それをマップするかどうかを決めることはできません。
あなたが持っているデータの種類がわからないというシナリオに陥ることはありませんが、プログラムについて詳しく知ることなく、具体的なアドバイスはできません。
実際にはincanter.statsの定型文です –