UdacityのPythonベースのCS212を使用し、Clojureに変換するという私の旅を続けて、次のような関数を作成しようとしています。
- シーケンス内のすべてのアイテムを返します。
- シーケンスの最大値に等しい、
- ベクトルを返す「キー」関数を使用する
Clojureのmax-key関数は、整数を返すためにキーが必要なことを除いて、ほとんどこれを行います。この場合、整数を返す必要はありません。ベクトルを返します。いくつかの変更を加えると、compare関数を使用して、キーイング関数によって返されるベクトルを比較できます。
(defn all-max-key
"Returns a vector of x for which (k x), arbitrated by compare, are greatest."
([k x] x)
([k x y] (if (= 1 (compare (k x) (k y))) x y))
([k x y & more]
(reduce #(all-max-key k %1 %2) (all-max-key k x y) more)))
ここで、問題は、これが同点を考慮していないことです(compareは0を返します)。つまり、リスト内のすべての要素は一意ですが、キーイング関数ごとに同等の値を持つものもあります。命令型の世界では、リストをループして最大値を追跡し、各要素をそれに比較してから、変更可能なリストを追加/置換する場合があります。
しかし、ループに頼らずにこれを行うには、慣用的でエレガントで機能的な方法が必要だと思います。私がreduceを使用しようとすると、すべて、シーケンスとメンバー要素の無意味な比較が発生しました。誰かがこれに光を当てることができますか?