Использование частичек внутри функции в качестве значения на карте - PullRequest
0 голосов
/ 30 сентября 2019

Во-первых;извините, если я использую неверную терминологию, я все еще плохо знаком с замыканием, а смена парадигмы занимает некоторое время.

Я пытаюсь работать с функцией, которая берет первый элемент из наборакоторый больше двенадцати (это «подростковое» число). Я могу написать это, когда просто применяю это непосредственно к набору, но я не уверен, как написать функцию в карте. Кто-нибудь может указать мне правильное направление?

Я попробовал несколько вещей, как правило, в духе (partial (first (filter (partial < 12)))), но пока без особой удачи, и исследование определений фильтра / частичного пока не принесло плодов. .

TL / DR Я хочу иметь в качестве значения на карте функцию, которая берет первый элемент в списке, который больше 12.

(def test-set [1, 8, 15, 22, 29])

(def some-functions {
  :first first
  :last last
  :teenth "I don't know what to put here"
})


(first (filter (partial < 12) test-set))

Ответы [ 2 ]

1 голос
/ 01 октября 2019

Я нашел небольшое улучшение в ответе @jas.

Функции

#(first (filter (partial < 12) %))

и

(defn teenth [coll] (first (filter (partial < 12) coll)))

используют комбинацию first и filter.

Это пример использования для функции some, как указано на clojuredocs.org [1].

Я бы предложил изменить рефакторинг функций на

(fn [coll] (some #(if (< 12 %) %) coll))

и

(defn teenth [coll] (some #(if (< 12 %) %) coll))

Из-за немного более сложной функции предикатов #(if (< 12 %) %) мы больше не можем использовать partial.

Обратите внимание, что вы не можете создавать вложенные анонимные функции с помощьючитатель макрос #() [2]. В этом случае вы должны использовать fn для создания вложенной анонимной функции, как показано выше.

На самом деле, вы можете использовать fn дважды, но, по моему мнению, он больше не читается:

(fn [coll] (some (fn [e] (if (< 12 e) e)) coll))

[1] https://clojuredocs.org/clojure.core/some#example-542692c6c026201cdc326940

[2] https://clojure.org/reference/reader#_dispatch

1 голос
/ 30 сентября 2019

Одним из способов является использование анонимной функции при определении карты (https://riptutorial.com/clojure/example/15544/defining-anonymous-functions)

> (def some-functions {
  :first first
  :last last
  :teenth #(first (filter (partial < 12) %))})

> ((:first some-functions) test-set)
1

> ((:last some-functions) test-set)
29

> ((:teenth some-functions) test-set)
15

Конечно, вы могли бы также явно указать свою функцию и использовать ее на своей карте:

> (defn teenth [coll] (first (filter (partial < 12) coll)))

> (def some-functions {
  :first first
  :last last
  :teenth teenth})

(Кроме того, будьте осторожны со словом set. В множествах clojure - неупорядоченные наборы уникальных значений. https://clojure.org/reference/data_structures)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...