Называя функцию, которая применяет список функций к одному значению - PullRequest
0 голосов
/ 02 декабря 2018

Но как вы вызываете функцию, которая принимает [X -> Y] и X и возвращает [Y]?Т.е. функция, которая принимает список функций и значение и возвращает список результатов, когда все функции из списка применены к данному аргументу.

Большинство обычных простых функций более высокого порядка имеют согласованные простые именав большинстве языков программирования:

  • Если функция принимает [X] и f: X -> Y и возвращает [Y}, то это обычно называется картой.(Иногда это метод, иногда функция, но принцип всегда один и тот же)
  • Если функция принимает логическое значение [X] и af: X -> и возвращает [X], это называется фильтром.
  • Если функция принимает [X] и af: X -> [Y] и возвращает backa [Y], она называется flatMap.

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

1 Ответ

0 голосов
/ 02 декабря 2018

Функции тоже имеют тип.Функция типа a -> b имеет тип, отличный от функции типа a -> c.

Итак, у вас есть функция x -> y.В концептуальном плане мы назовем этот тип z.И у вас есть список этих функций z -типа, но вам нужен список y, поэтому вам нужно [z] -> [y] - это именно то, что делает map.

Если мы расширим z Возвращаясь к нашему исходному типу x -> y, мы можем увидеть окончательный тип функции, которую мы пытаемся создать: [x -> y] -> [y].Все, что осталось, это получить от x -> y до y.Давайте посмотрим apply -

// apply : a -> (a -> b) -> b
const apply = x => f =>
  f (x)

Если мы дадим аргумент apply, он вернет нам функцию того типа, который вы ищете -

apply (2)        // : (Number -> b) -> b
apply ("hello")  // : (String -> b) -> b

Объединениеmap и apply мы достигаем нашего результата -

// apply : a -> (a -> b) -> b
const apply = x => f =>
  f (x)

// mult : Number -> Number -> Number  
const mult = x => y =>
  x * y
  
// listOfFuncs : [ Number -> Number ]
const listOfFuncs =
  [ mult (1)         // : Number -> Number
  , mult (2)         // : Number -> Number
  , mult (3)         // : Number -> Number
  , mult (4)         // : Number -> Number
  ]
  
console .log
  ( listOfFuncs .map (apply (2))   // [ 2, 4, 6, 8 ] : [ Number ]
  , listOfFuncs .map (apply (10))  // [ 10, 20, 30, 40 ] : [ Number ]
  )

Я никогда не видел уникального имени, данного этой конкретной комбинации функций, но я не думаю, что оно тоже нужно.map и apply оба просты, и я думаю, что они кодируют ваше намерение напрямую.


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

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

...