ผมไม่ค่อยได้มีโอกาสใช้สองฟังก์ชันนี้บ่อยครั้งนัก วันนี้นึกขึ้นมาได้ว่ามันใช้สำหรับ compose predicate function เทียบได้กับ and และ or เลย
(def products [{:id 1 :stocked true :price 85} {:id 2 :stocked true :price 200} {:id 3 :stocked false :price 50} {:id 4 :stocked false :price 150}]) (defn cheap? [p] (< p 100))
โค้ดสองบรรทัดต่อไปนี้ให้ผลลัพธ์เดียวกัน
(filter #(and (:stocked %) (cheap? (:price %))) products) (filter (every-pred :stocked (comp cheap? :price)) products)
และโค้ดสองบรรทัดต่อไปนี้ให้ผลลัพธ์เดียวกัน
(filter #(or (:stocked %) (cheap? (:price %))) products) (filter (some-fn :stocked (comp cheap? :price)) products)
พอสรุปได้แบบนี้แล้ว น่าจะได้หยิบมันมาใช้บ่อยขึ้น