Предварительный расчет в чистом функционале javascript - PullRequest
2 голосов
/ 04 мая 2020

У меня есть такой код:

let createArray = (A) =>
  A.map((val) =>
    val * heavyFn(A.length)
  )

, где heavyFn(X) - это функция, потребляющая ресурсы, которая всегда возвращает одно и то же значение для константы X. Я считаю, что хорошие функциональные языки, такие как Haskell, оптимизируют это, поэтому heavyFn(X) вызывается только один раз для каждого результата, но javascript, очевидно, нет.

Я мог бы оптимизировать его следующим образом:

let createArray = (A) => {
  const H = heavyFn(A.length);
  return A.map((val) =>
    val * H
  )
}

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

Единственный способ, которым я понял, был

let createArray = A => [heavyFn(A.length), ...A].map((val,i,H) =>
  val * H[0]
).slice(1)

, но это похоже на взлом.

Ответы [ 2 ]

1 голос
/ 04 мая 2020

Используйте функцию карри:

const mult = x => y => x * y;
const createArray = A => A.map(mult(heavyFn(A.length)));
1 голос
/ 04 мая 2020

Вы можете взять закрытие более heavy с IIFE.

let createArray = (A) => 
        (heavy => A.map((val) => val * heavy))
        (heavyFn(A.length));
...