З мого досвіду, аплікативні функтори чудові з наступних причин:
Певні типи структур даних допускають потужні типи композицій, але насправді не можуть бути монадами. Насправді більшість абстракцій у функціональному реактивному програмуванні належать до цієї категорії. Хоча ми технічно можемо зробити, наприклад, Behavior
(ака Signal
) монаду, як правило, це не може бути зроблено ефективно. Аплікативні функтори дозволяють нам все ще мати потужні композиції, не жертвуючи ефективністю (правда, дещо складніше використовувати аплікатив, ніж монаду, просто тому, що у вас не так багато структури, з якою можна працювати).
Відсутність залежності від даних у аплікативному функторі дозволяє, наприклад, здійснити обхід дії, шукаючи всі ефекти, які вона може дати, не маючи даних. Отже, ви можете собі уявити застосунок "веб-форма", який використовується так:
userData = User <$> field "Name" <*> field "Address"
і ви можете написати механізм, який обходиться, щоб знайти всі використані поля та відобразити їх у формі, а потім, коли ви повернете дані, запустіть їх знову, щоб отримати побудовані User
. Цього не можна зробити за допомогою звичайного функтора (оскільки він поєднує дві форми в одну), ні монади, оскільки за допомогою монади ви можете виразити:
userData = do
name <- field "Name"
address <- field $ name ++ "'s address"
return (User name address)
який неможливо відтворити, оскільки ім'я другого поля не може бути відоме, не маючи відповіді з першого. Я майже впевнений, що існує бібліотека, яка реалізує ідею цієї форми - я кілька разів прокатував свою для цього і того проекту.
Інша приємна річ аплікативних функторів - це те, що вони складають . Точніше, функтор композиції:
newtype Compose f g x = Compose (f (g x))
застосовується будь-коли f
і g
є. Те саме не можна сказати про монади, що створює цілу історію монадних трансформаторів, яка ускладнюється якимось неприємним чином. Таким чином, додатки надзвичайно чисті, і це означає, що ви можете створити структуру потрібного вам типу, зосередившись на невеликих компонуючих компонентах.
Нещодавно ApplicativeDo
розширення з'явилося в GHC, що дозволяє використовувати do
позначення з додатками, полегшуючи деякі нотаційні складності, якщо ви не робите жодних монадійних дій.