Здравствуйте, gandjustas, Вы писали:
G>Проще всего на примере Maybe монады увидеть
G>G>//Ручками
G>Maybe<int> Add1(Maybe<int> a, Maybe<int> b)
G>{
G> if(!a.HasValue || !b.HasValue) return Maybe.None<int>();
G> return Maybe.Return(a.Value+b.Value);
G>}
G>//Через bind
G>Maybe<int> Add2(Maybe<int> a, Maybe<int> b)
G>{
G> return Bind(a, v1 => Bind(b, v2 => Maybe.Return(v1+v2)));
G>}
G>//Через монадный синтаксис
G>Maybe<int> Add3(Maybe<int> a, Maybe<int> b)
G>{
G> return from v1 in a
G> from v2 in b
G> select v1+v2;
G>}
G>
Хм, но это же ад. Первый вариант — самый понятный.
Да и зачем монада тут?
Разве нельзя сделать примерно так (предположим, что в С# есть интерфейсы для чисел и классы типов):
T Add<T>(T a, T b) where T : IAddable<T>
{
return a + b;
}
implementation IAddable<int> for Maybe<int>
{
...
}
И все — можно в этот Add пхать что угодно, хоть число, хоть Maybe...
Ну и самое главное — на этом примере уменьшения количества писанины не видно...