Передача разделов в другую функцию в 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 непосредственно вы можете использовать деструктурирование

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

Для лучшей читабельности вы можете использовать->> макрос.

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

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

Вы можете избежать apply, если ваша функция разрушает переданную последовательность:

(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ý
..................................................................................................................