Re[32]: Есть ли вещи, которые вы прницпиально не понимаете...
От: meadow_meal  
Дата: 07.01.14 13:57
Оценка:
Здравствуйте, alex_public, Вы писали:

K>>Это совершенно отдельный разговор не про полезность монад, а про полезность контроля эффектов.


_>Совершенно верно. И как раз про это я спрашиваю уже очень давно и так ни разу и не получил ответа. Естественно про какие-то случаи из реальной практики, а не обобщённую теорию..


Нужен практический пример полезности контроля эффектов? Есть процесс, имеющий состояние и управляемый потоком событий. Результатом обработки события может быть либо ошибка (и старое состояние), либо новое измененное состояние и ряд эффектов (конкретно — изменение внешнего мира).

Без контроля эффектов псевдокод будет выглядеть так:

processEvent(Event, State)
{
  if (validateEvent(Event, State))
    return processValidEvent(Event, State);
  else
    return State;
}


Сложность функции validateEvent в реальности может оказаться слишком велика. Мы хотим писать так:

processEvent(Event, State)
{
  try
  {
    return processEventOrFail(Event, State);
  }
  catch
  {
    return State;
  }
}


State иммутабельно. Способ возврата ошибки (в данном случае — исключение) к примеру отношения не имеет.

Если бы processEventOrFail не имела побочных эффектов (в данном случае кроме возврата исключения), этот код был бы удовлетворителен. Если язык не позволяет тем или иным способом контролировать эффекты, мы будем выкручиваться как-то так (код по прежнему очень псевдо):

...
(NewState, Effects) = processEventOrFail(Event, State);
applyEffects(Effects);
return NewState;
...


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