ส่งให้เห็นถึงพาร์ทิชันที่มีอยู่ให้คนอื่นฟังก์ชันใน clojure

0

คำถาม

ฉันเพิ่งเริ่ม clojure แต่ฉันไม่สามารถดูเหมือนจะคิดให้ออกใช้/กำลังสร้างระดับสูงฟังก์ชัน.

ฉันต้องกแบ่งส่วนเป็นชุดสะสมและฉันอยากจะผ่านมันไปยังอีกฟังก์ชันที่จะทำอะไรบางอย่างกับหน้าต่างของรายการ. ฉันไม่แน่ใจว่าจะไปถึงทำอย่างนี้

(def foo [:a :b :c :d :e])

(partition 3 1 foo)
;;=> ((:a :b :c) (:b :c :d) (:c :d :e))

(defn bar [start next end])

ฉันคิดว่าคนพื้นฐานเส้นต้องเป็นอย่างนั้น

(defn faz [collect]
    (partition 3 1 collect)
    ;;maybe do here before passing
    (bar stand next end)
)

ฉันอาจจะกำลังก้าวหน้าต่อไปของตัวเองแต่ฉันยังเห็นมันยังมีอีกหลายฟังก์ชันแบบลดและปรับใช้พวกเขาสามารถทำบางอย่างที่คล้ายกันใช่มั้ย? ถึงแม้ว่าส่วนตัวอย่างผมเห็นมีมันแล้วพวกเขาแสดงปฏิบัติการอยู่สองรายการในเวลาซึ่งคล้ายกับ (partition 2 1 foo)

clojure higher-order-functions
2021-11-20 10:49:57
2

คำตอบที่ดีที่สุด

1

คุณสามารถทำบางอย่างอย่าง

(defn bar [start next end])


(defn faz [collect]
  (let [partitions (partition 3 1 collect)]
    (apply bar partitions)
    ))

หรือถ้าคุณอยากจะโทรหา bar โดยตรงคุณสามารถใช้ destructuring

(defn bar [start next end])

(defn faz [collect]
  (let [partitions (partition 3 1 collect)
        [start next end] partitions]
    (bar start next end)
    ))
2021-11-20 11:08:30
0

ขอถามคำถามคือนายพลและนั่นเป็นอีกวิธีที่จะประสบความสำเร็จในส่วนนี้ดูจากการคาดหวังผลและใช้ฟังก์ชัน.

ถ้าคุณต้องการกลับลำดับของการแค่ผลลัพธ์เท่านั้นใช้ map แล้ว apply:

(defn results-for-triplets [collect]
  (map #(apply + %) (partition 3 1 collect)))

(results-for-triplets [1 2 3 4 5])
=> (6 9 12)

สำหรับดีกว่า readability คุณสามารถใช้ ->> มาโคร.

(defn results-for-triplets [collect]
  (->> collect
       (partition 3 1)
       (map #(apply + %))))

(results-for-triplets [1 2 3 4 5])
=> (6 9 12)

คุณสามารถหลีกเลี่ยง applyถ้าคุณฟังก์ชัน destructures ผ่านลำดับ:

(defn sum3 [[a b c]]
  (+ a b c))

(defn results-for-triplets [collect]
  (->> collect
       (partition 3 1)
       (map sum3)))

(results-for-triplets [1 2 3 4 5])
=> (6 9 12)

ถ้าคุณต้องการเรียกฟังก์ชันสำหรับผลข้างเคียงแล้วจากนั้นก็แลกเปลี่ยน nilใช้ run!:

(defn print3 [[a b c]]
  (println a b c))

(defn results-for-triplets [collect]
  (->> collect
       (partition 3 1)
       (run! print3)))

(results-for-triplets [1 2 3 4 5])
1 2 3
2 3 4
3 4 5
=> nil
2021-11-20 11:51:18

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................