Здравствуйте, Ikemefula, Вы писали:
I>Не стало, но код в итоге получается более предсказуемый. И до кучи получается неявный pattern matching
Да, наверное более предсказуемый, но все равно места для потенциальных ошибок остались (на ровном месте вводятся дополнительные переменные, которые не нужны).
Вот к примеру, если взять цикл "for (int i = 0; i < arr.Length; i++) { use(arr[i]; }" — здесь мы видим сразу 4 места, где можно ошибиться.
Путем замены цикла на "foreach (var item in arr) { use(item); }" мы ликвидируем все из них.
Или например, если мы это:
var
val: Integer;
begin
if condition then
val = 3;
else
val = 5;
use(val);
end
меняем на:
begin
use(if condition then 3 else 5 end);
end
тоже преимущество видно и измеряемо: убрали лишнюю переменную.
А с монадами везде как-то шило на мыло получается. Я понимаю, что без монадных костылей функциональные языки не могут записать последовательность вызовов.
Но в императивном коде... Мне понравился пример jazzer'a про убирание цепочки if-ов, когда в языке нет исключений. Но опять же, ИМХО, такие вещи должны выглядеть на call-site без специальных нотаций и вообще без каких-то признаков наличия монад.