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

Что такое монадическая обработка ошибок? И почему это круто? К примеру в языке Go нет функциональности try-catch-finally. Как я понимаю это позаимствовано из функциональных языков. Объясните для человека не знакомого с функциональным программированием, в чем плюс отсутствия try-catch-finally.
  • Вопрос задан
  • 224 просмотра
Пригласить эксперта
Ответы на вопрос 5
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
Посмотрите причину создания и основные требования к языку

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

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

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

Отсутствие неявных преобразований.
Ответ написан
Комментировать
@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 но я его не найду никак.
Ответ написан
vabka
@vabka
Токсичный шарпист
Монадическая обработка ошибок - это когда для представления результата операции, которая может закончиться ошибок, используется монада. Например Either (aka Result).

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

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

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

Также советую посмотреть на railroad oriented programming, ссылку на которую скинул Александр Скуснов.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Метр квадратный Санкт-Петербург
от 150 000 до 350 000 ₽
A4.finance Москва
от 350 000 до 500 000 ₽
netPrint.ru Москва
от 200 000 до 220 000 ₽
03 июн. 2022, в 09:57
500 руб./за проект
03 июн. 2022, в 09:35
1000 руб./за проект
03 июн. 2022, в 09:27
6500 руб./за проект