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

Зачем нужны монады?

Прочитав статью понял, что монада - это обертка над последовательностью методов, которая позволяет обрабатывать ошибки возникающие в случае если один из методов не получил данные и упал.

Собственно вопрос - правильно ли я понял идею?
Второй вопрос, который был поднят в комментариях -- почему бы не выбросить исключение вместо того, чтобы возвращать половинчатый результат.

Если можно объясните простыми словами.
  • Вопрос задан
  • 3311 просмотров
Подписаться 9 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 3
@balamut108
Py
Я как-то был на лекции по функц. программированию и лектор сказал, что если вы спрашиваете зачем вам использовать монады, тогда вам не нужно использовать монады, так что послушай умного человека (лектора) и расслабься :)
Ответ написан
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Ух, просто не выйдет. Грубо говоря это альтернатива null-ам, но не только. Они в принципе обобщают много чего.

Рекомендую почитать: habrahabr.ru/post/151703 + пробегитесь по комментам. Там и ссылки хорошие дают, и мысли высказывают неплохие.
Ответ написан
То, что вы описали - частный случай.
Вот несколько частных случаев (хаскель vs псевдокод).
Обратите внимание, что на Хаскеле код линейный
То, что сделано монадами, в других языках нередко встроено. Удобство невстроенного решения в том, что есть немало функций, которые работают с любыми монадами (mapM, filterM, ...), применить которые к встроенным в язык вещам может быть проблематично.

1. nullable
do
    x <- foo
    y <- bar x
    return $ baz y

вместо
x = foo();
if (x) {
    y = bar();
    if (y) {
        return baz(y); } }


2. списки
do
    x <- lines str
    y <- words x
    return $ length y

вместо
for (x in lines(str))
    for (y in words(x))
        yield y.length();


3. continuation
do
    h1 <- ContT $ withFile "1.txt" ReadMode
    h2 <- ContT $ withFile "2.txt" WriteMode
    liftIO $ ...use handles...

вместо
using (h1 = File.Open("1.txt", File.Mode.Read)) {
    using (h2 = File.Open("2.txt", File.Mode.Write)) {
        ...use files... }}


Причем можно, например, и так:
do
    -- сразу список файлов открываем
    hs <- mapM (\name -> ContT (withFile name ReadMode))
        ["1.txt", "2.txt", "3.txt", "4.txt"]

А как сделать так с using'ами?
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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