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