Какой подход к поиску нескольких итогов более точно соответствует парадигме функционального программирования?

Скажем, у вас есть массив объектов со структурой вроде {id: 1, type: 'A', value: 10}, и вы хотите найти сумму типов A, B и C.

Было бы более эффективно инициализировать итоговые переменные, а затем пройтись по массиву один раз, добавляя итоговые переменные на основе типа, чем использовать функцию сокращения для каждого итога, фактически проходя по массиву 3 раза.

Однако из того, что я понимаю из парадигмы функционального программирования, функции не должны манипулировать чем-либо за пределами своей внутренней области, а функции должны иметь только одну цель, поэтому последний подход был бы предпочтительнее.

Подход 1: инициализировать переменную для каждого из трех типов, зациклить один раз и добавить к каждой сумме в зависимости от типа.

Подход 2: используйте функцию сокращения для каждого общего типа.

Какой из них предпочтительнее?

Какой язык вы используете? Вы можете уменьшить запись, содержащую три значения, если хотите избежать многократных проходов.

Lee 23.02.2019 17:15

"Было бы эффективнее…" - что именно заставляет вас так думать? Сложность времени выполнения линейна в любом решении.

Bergi 23.02.2019 17:24

@Bergi, более эффективно перебирать массив только один раз, а не три раза.

Steven Anderson 24.02.2019 22:01

@Ли, я использую Javascript. Я не знаю метода сокращения, который возвращает три значения.

Steven Anderson 24.02.2019 22:02

@StevenAnderson 3 цикла с 1 оператором в теле так же эффективны, как 1 цикл с 3 операторами в теле.

Bergi 24.02.2019 22:03

@StevenAnderson Lee говорит об использовании {totalA: 0, totalB: 0, totalC: 0} в качестве аккумулятора reduce

Bergi 24.02.2019 22:04
Введение в одну из самых важных концепций в React - функциональное программирование
Введение в одну из самых важных концепций в React - функциональное программирование
React разработан с использованием концепции функционального программирования, поэтому понимание функционального программирования важно для изучения...
Фото ️🔁 Radek Jedynak 🔃 on ️🔁 Unsplash 🔃
Фото ️🔁 Radek Jedynak 🔃 on ️🔁 Unsplash 🔃
Что такое Java 8 Streams API? Java 8 Stream API
0
6
29
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать одну складку/уменьшение, если используете запись, содержащую три значения, в качестве состояния, например. в кложуре:

(defn sum-inputs [inputs]
  (reduce (fn [acc {:keys [type value]}]
            (update acc (keyword type) + value))
          {:A 0 :B 0 :C 0}
          inputs))

тогда

(sum-inputs [{:id 1 :type "A" :value 10}
             {:id 2 :type "B" :value 12}
             {:id 3 :type "B" :value 7}
             {:id 4 :type "C" :value 40}])

в Javascript похоже, что вы можете использовать Array.reduce:

const input = [{id: 1, type: "A", value: 4}, {id: 2, type: "B", value: 3}, {id: 3, type: "B", value: 9}, {id: 4, type: "C", value: 2}]
input.reduce(function(acc, i) { acc[i.type] += i.value; return acc; }, {A: 0, B: 0, C: 0})

обратите внимание, что это изменяет запись аккумулятора на месте.

Спасибо, Ли. Я использую Javascript. Я не знаю метода сокращения, который возвращает три значения.

Steven Anderson 24.02.2019 22:02

@StevenAnderson - существует только одно значение, запись, содержащая три значения. Я обновил пример для Javascript.

Lee 24.02.2019 22:14

Это имеет смысл, Ли, теперь я вижу это! Спасибо.

Steven Anderson 25.02.2019 22:18

Другие вопросы по теме