「コレクションでありマップではない」という意味のClojure述語はありますか?非マップコレクション述語?
このような述語は、マップ以外のすべてのコレクションで実行できる操作が多いため、有用です。たとえば、(apply + ...)
または(reduce + ...)
は、ベクトル、リスト、遅延シーケンス、およびセットで使用できますが、マップでは使用できません。そのようなコンテキストのマップ要素はclojure.lang.MapEntry
になります。それは私の知っているものを述語に問題を引き起こすセットとマップです:
sequential?
はベクトル、リスト、怠惰なシーケンスのために真であるが、それはマップとセットの両方のために偽です。 (seq?
は似ていますが、ベクトルの場合は偽です)coll?
とseqable?
は、私が考えることができる他の種類のコレクションと同様に、セットとマップの両方に当てはまります。
もちろん、このような述語を定義することができます。このような:
(defn coll-but-not-map?
[xs]
(and (coll? xs)
(not (map? xs))))
またはこのような
:(defn sequential-or-set?
[xs]
(or (sequential? xs)
(set? xs)))
私は同じことを行いclojure.core内蔵(または貢献ライブラリ)述語があるのかどうかと思いまして。
この質問はthis oneとthis oneに関連していますが、その回答では答えられません。 (私の質問が見つからない場合は、それをそのようにマークしてもらえれば幸いです)
なぜあなたの関数がどのようなデータ構造を持っているのか分かりませんか? @ジョシュはあなたの「はい」/「いいえ」という質問に「いいえ」と回答し、役立つアドバイスを提供しました。あなたがやろうとしていることについてもっと文脈がなくても、あなたを助けるのは難しいです。マルチメソッドを試してみませんか? –
@Brandonに質問ありがとうございます。私は葉のノードが数字の非マップのコレクション、または裸の番号のような何かであるマップの地図(地図の(地図の...))の地図に再帰しています。私は数字の各コレクションの統計を計算したいが、裸の数値は計算しない。現在のところ、リーフコレクションはすべてのシーケンスですが、関数をより一般的なものにして、セットを処理するのはなぜですか?また、fl00rの答えに私のコメントを参照してください。 – Mars