Я понимаю, что когда вы работаете с аппликаторами, map
берет F<A>
и f: A->B
и выдает F<B>
. Или, другими словами, он разворачивает значение, применяет функцию и переупаковывает ее в том же контексте. В псевдокоде option(9).map{squareRoot} == option(3)
я также понимаю, что apply
аналогично. Он берет F<A>
и F<f: A->B>
и производит F<B>
. Другими словами, он разворачивает значение, разворачивает функцию, применяет функцию к значению, а затем повторно оборачивает результат этого.
map
очевидно. Он повсеместно используется со списками / последовательностями на множестве языков.
Менее очевидным для меня является случай, когда вам когда-нибудь понадобится ap
(который, как я видел, определен как композиция pure
и map
как есть). Да, если у вас есть функция, заключенная в тип данных, такой как Option
, и значение, заключенное в тот же тип, вы, естественно, используете apply
. Но когда бы вы когда-нибудь обернули такую функцию?
Я могу думать только об одном сценарии использования как о новых ie более эзотерических c концепциях функционального программирования, и это когда у вас есть список значений и список функций, и вы хотите список значений с примененными функциями. Итак,
list(1,2,3).apply(list(square,cube)) == list(1,4,9,1,8,27) // or (1,1,4,8,1,27)...
Существуют ли полезные примеры этого с опцией, либо et, c., А не просто выдуманные примеры, чтобы показать, что apply
делает?
Редактировать Единственный другой пример, который я могу вспомнить, это, например, вы извлекаете «правило» из базы данных, чтобы применить к некоторым данным, но это может не произойти. быть связанным правилом.
Итак, у вас есть 9
, и вы извлекли "правило" из БД: option<rule>
. Если правило является сериализованной функцией, вы можете выполнить some(9).apply(option<rule>)
, если, если нет правила (или нет значения, к которому следует применить правило), вы получите None, но если есть правило, вы получите результат в обертке в некоторых.
Но это кажется искусным, чтобы найти оправдание для использования apply
. Встречаются ли такие вещи в развитии предприятия или академии c? Я не могу вспомнить.
Пример списка тоже кажется надуманным, так как обычно я думаю, что я хотел бы, чтобы результаты были сгруппированы как-то вроде списка 2х3, а не одномерной коллекции.