Задать вопрос

Что такое монадическая обработка ошибок?

Что такое монадическая обработка ошибок? И почему это круто? К примеру в языке Go нет функциональности try-catch-finally. Как я понимаю это позаимствовано из функциональных языков. Объясните для человека не знакомого с функциональным программированием, в чем плюс отсутствия try-catch-finally.
  • Вопрос задан
  • 623 просмотра
Подписаться 4 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 6
uvelichitel
@uvelichitel Куратор тега Go
habrahabr.ru/users/uvelichitel
Errors are values.
Don't just check errors, handle them gracefully.
(c) Rob Pike https://go-proverbs.github.io/
Ответ написан
Комментировать
@AlexSku
не буду отвечать из-за модератора
Наглядные картинки в "железнодорожно-ориентированном" программировании.
Ответ написан
Комментировать
alfss
@alfss
https://career.habr.com/alfss
Посмотрите причину создания и основные требования к языку

Ортогональность. Язык должен предоставлять небольшое число средств, не повторяющих функциональность друг друга.

Простая и регулярная грамматика. Минимум ключевых слов, простая, легко разбираемая грамматическая структура, легко читаемый код.

Простая работа с типами. Типизация должна обеспечивать безопасность, но не превращаться в бюрократию, лишь увеличивающую код. Отказ от иерархии типов, но с сохранением объектно-ориентированных возможностей.

Отсутствие неявных преобразований.
Ответ написан
Комментировать
mayton2019
@mayton2019
Bigdata Engineer
Интересно обратываются ошибки I/O в Rust. Там такой синтаксис что ты не можешь получить результат не обработав ошибку. Является ли это монадической схемой? ХЗ.
use std::fs;

fn main() {
    let data = fs::read_to_string("/etc/hosts").expect("Unable to read file");
    println!("{}", data);
}

В других языках можно как-то проскочить между капелек дождя. Просто не делать секцию catch(exception) а здесь компиллятор просто не соберет код без except().

Есть еще другой более красивый кейс с Rust но я его не найду никак.
Ответ написан
Монадическая обработка ошибок - это когда для представления результата операции, которая может закончиться ошибок, используется монада. Например Either (aka Result).

В Go хоть и нет try-catch, но и монадической обработки ошибок тоже нет.

Главнаый смысл монад в том, что ты не можешь напрямую молча её распаковать.
А ещё есть функция map() с помощью которой можно безопасно обработать успешный результат.

Хорошие примеры языков с такой системой - Haskell, F#, Ocaml, Rust.

Также советую посмотреть на railroad oriented programming, ссылку на которую скинул Александр Скуснов.
Ответ написан
Комментировать
@Vitsliputsli
Что такое монадическая обработка ошибок? И почему это круто?

Очевидно использование монад для обработки ошибок. "Монада – это просто моноид в категории эндофункторов. Функтор – это гомоморфизм между категориями. А эндофунктор – это просто функтор, отображающий категорию на саму себя. "
По-моему уже этого достаточно, чтобы ответить на 2ой вопрос.

Объясните для человека не знакомого с функциональным программированием, в чем плюс отсутствия try-catch-finally.

Монада - это попытка обойти ограничения функционального программирования, выполнять последовательные операции, т.е. делать то, что делается при императивном подходе из коробки. Т.е. монада специфична для функционального, а try-catch-finally для императивного, и последний в первый никак не запихнуть, поэтому - монада.
Нет принципиальной разницы в этих методах обработки ошибок, ошибки идут отдельным потоком, разница лишь когда будет вызван обработчик.
Насколько я знаю, для монад есть еще один аргумент - это убирание обработки ошибок "под капот", т.е. мы видим решение только тест-кейса основной бизнес-логики, а тест-кейсы ошибок скрыты. Если говорить про ООП, там это не проблема, при подобном структурировании обработчик ошибок будет именно там, где и должен быть, к примеру, если мы говорим о "File not found", то в классе отвечающем за инфраструктуру и в бизнес-логике мы его не увидим. Кроме того, мы можем задать общий обработчик, а не писать всюду try catch. Что касается процедурного подхода, то наверное абсолютно все спрятать не получится, но если мы в 22 году пишем процедурно, у нас приоритет не структуризация, а производительность и здесь уже другие критерии.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы