Passando partições para outra função em clojure

0

Pergunta

Eu sou apenas começou clojure, mas eu não consigo descobrir utilização/criação de funções de ordem superior.

Eu tenho particionado uma coleção e eu quero passar o que em outra função que vai fazer algo para a janela de itens. Eu não tenho certeza de como fazer isso.

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

Eu acho que a estrutura básica seria.

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

Eu devo estar ficando à frente de mim, mas eu também ver que existem outras funções como reduzir e aplicar o que eles podem fazer algo semelhante, certo? Embora, a maioria dos exemplos que eu vejo assim que realizar operações em dois itens de uma vez, que são similares à (partition 2 1 foo)

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

Melhor resposta

1

Você pode fazer algo como

(defn bar [start next end])


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

ou, se você quiser chamá bar diretamente, você pode usar desestruturação

(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

Sua pergunta é geral e não há mais maneiras de conseguir isto, com base no resultado esperado e usados função.

Se você deseja retornar sequência de resultados, use map e apply:

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

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

Para melhor legibilidade, você pode usar ->> macro.

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

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

Você pode evitar apply, se sua função destructures passado sequência:

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

Se você quiser chamar a função para efeito de lado e, em seguida, retornar nil, uso 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

Em outros idiomas

Esta página está em outros idiomas

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