(defn sort-map-by-value
"Given a map return a sorted map, in which the sort is done on the map's values, instead of keys.
Takes a function as an input, which will be used for sorting"
[cf kf]
(fn [m]
(->> m
map-invert
(into (sorted-map-by #(cf (kf %1) (kf %2))))
map-invert)))
(defn date-time-comparator
"Predicate function for comparing two date-time's"
[time1 time2]
(before? time1 time2))
(defn get-time-value
"Function for extracting the date-time from the value of the given map."
[v]
(-> v first :time))
(def sort-map-by-date (sort-map-by-value date-time-comparator get-time-value))
(sort-map-by-date {"3-19-2013" [{:time (date-time 2013 3 19 12 14 45)}]
"3-9-2013" [{:time (date-time 2013 3 9 16 46 49)}]
"2-25-2013" [{:time (date-time 2013 2 25 2 38 15)}]
"3-14-2013" [{:time (date-time 2013 3 14 7 19 23)}]
"2-8-2013" [{:time (date-time 2013 2 8 12 44 47)}]
})
高階関数を使用するための慣用的なパターンを理解しようとしています。特に関数を返す関数の場合。最初の関数sort-map-by-valueは、パラメーターとして2 fnsを取り、パラメーターとしてマップを受け取る関数を返します。
上記の関数は、2つの関数とマップの3つすべてをパラメーターとして受け取ることもできます。したがって、この場合、別の関数を返す関数を作成する必要はありません。それが必要になる場合はどうなるでしょうか。言い換えれば、関数を返す関数を導入するための慣用的なパターンは何ですか?