[#] [Перевод] Использование монад в С++. Часть 2: монада состояния
habrabot(difrex,1) — All
2015-06-26 14:30:02


[**Часть 1**][1] **Часть 2** Что вы сделаете, если завтра выиграете в лотерею? Купите спортивную машину, бросите работу и поедете в турне по США? А может быть станете основателем собственной компании, приумножите состояние и купите личный самолёт? Мы все любим делать планы, и чаще всего они опираются на наше финансовое состояние. Такие планы могут быть описаны функцией. К примеру, план покупки машины это:

pair<Car, Cash> buyCar(Cash cashIn)


На входе у нас некоторое количество денег (**Cash**), а на выходе новенькая машина (**Car**) и какое-то количество(не факт, что положительное!) оставшихся финансов (**Cash**).В общем, финансовый план — это функция, которая принимает деньги и возвращает результат, плюс оставшееся количество денег. Он может быть описан шаблоном:

template<class A>
using Plan = function<pair<A, Cash>(Cash)>;


Вы можете объединять маленькие планы чтобы получить большой. К примеру, вы можете пустить оставшиеся после покупки машины средства на свою поездку или инвестировать в бизнес. Если у вас есть вещи, уже вам принадлежащие, они могут стать часть ваших планов:

template<class A>
Plan<A> got_it(A a)
{
return [a](Cash s) { return make_pair(a, s); };
}


Какое отношение имеют все эти мечты к решению нашего [пазла][2]? Ранее я говорил, что нам нужно где-то сохранять состояние, и это способ, которым программисты на функциональных языках работают с состоянием. Вместо явного модифицирования состояния они пишут код, который генерирует план действий. [Читать дальше →][3]

[1]: http://habrahabr.ru/company/infopulse/blog/260809/
[2]: http://habrahabr.ru/company/infopulse/blog/260809/
[3]: http://habrahabr.ru/post/261145/#habracut