В Haskell вы можете применить fmap
к двум функциям, которые в основном являются составной частью композиции. Вы можете даже составить fmap
, чтобы включить функциональный состав функций с более высокой степенью (fmap . fmap
).Как реализовать функтор, чтобы карта могла применяться к двум функциям?
Это работает, потому что функции являются функторами.
Как бы такой функтор (или соответствующий метод map
) был реализован в Javascript?
Это то, что я пытался до сих пор:
funcProto = {
map(f) { return y => f(this.x(y)) }
};
function func(x) {
return Object.assign(Object.create(funcProto), {x: x});
}
const comp = f => g => x => f(g(x));
const map = f => ftor => ftor.map(f);
const sub = y => x => x - y;
const sqr = x => x * x;
const inc = x => x + 1;
Это работает для нормальной функции состава:
func(sqr).map(inc)(2); // 5
Однако, это не работает для составленной версии map
:
const map2 = comp(map)(map);
map2(sub)(sub)(10)(5)(4); // Error
Я думаю, что я слишком сильно адаптирую себя к традиционному способу работы им в Javascript. Функции как функторы ведут себя иначе, чем список или, может быть.
«* функции традиционного способа реализованы в Javascript *» - их нет. – Bergi