Какой подход для нахождения нескольких итогов более точно следует парадигме функционального программирования? - PullRequest
0 голосов
/ 23 февраля 2019

Допустим, у вас есть массив объектов со структурой, такой как {id: 1, тип: 'A', значение: 10}, хотите найти сумму типа A, типа B и типа C.

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

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

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

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

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

1 Ответ

0 голосов
/ 23 февраля 2019

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

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

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

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