Bölümleri clojure'da başka bir işleve geçirme

0

Soru

Sadece clojure başladı ama ben kullanarak yüksek dereceden fonksiyonlar oluşturma anlamaya görünmüyor olabilir.

Bir koleksiyonu bölümledim ve bunu öğelerin penceresine bir şeyler yapacak başka bir işleve aktarmak istiyorum. Bunu nasıl yapacağımdan emin değilim.

(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])

Bence ana hat şöyle olurdu.

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

Kendimin önüne geçiyor olabilirim ama aynı zamanda reduce ve apply gibi benzer bir şey yapabilecekleri başka işlevler de olduğunu görüyorum, değil mi? Gördüğüm örneklerin çoğu buna sahip olsa da, aynı anda iki öğe üzerinde benzer işlemler gerçekleştiriyorlar (partition 2 1 foo)

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

En iyi cevabı

1

Şöyle bir şey yapabilirsin

(defn bar [start next end])


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

ya da aramak istersen bar doğrudan, yıkımı kullanabilirsiniz

(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

Sorunuz geneldir ve beklenen sonuca ve kullanılan işleve dayanarak bunu başarmanın daha fazla yolu vardır.

Sonuç sırasını döndürmek istiyorsanız, aşağıdakileri kullanınmap veapply:

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

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

Daha iyi okunabilirlik için şunları kullanabilirsiniz->> makro.

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

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

Önleyebilirsiniz apply eğer işlevi destructures geçti sıra:

(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)

Yan etki için işlevi çağırmak ve sonra geri dönmek istiyorsanız nil, kullanma 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

Diğer dillerde

Bu sayfa diğer dillerde

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