Re[4]: Монады
От: AlexRK  
Дата: 27.10.14 19:22
Оценка:
Здравствуйте, 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...


Ну и самое главное — на этом примере уменьшения количества писанины не видно...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.