[Перевод] Тройка полезных монад

Внимание: перед тем как читать текст ниже, вы уже должны иметь представление о том, что такое монады. Если это не так, то прежде прочитайте вот этот пост! Перед нами функция half: caeb90f70d874d167b9c41b79f6d9936.png И мы можем применить её несколько раз: half. half $ 8 => 2 Всё работает как и ожидалось. Но вот вы решили, что хорошо бы иметь лог того, что происходит с этой функцией: 589c2938bad51c85d798b6b6a9109331.pnghalf x = (x `div` 2, «Я только что располовинил » ++ (show x) ++ »!») Что ж, отлично. Но что будет если вы теперь захотите применить half несколько раз? half. half $ 8 Вот то, что мы хотели бы, чтобы происходило: 79d2767a62262147d45b5cd660041b34.pngСпойлер: автоматически так не сделается. Придётся всё расписывать ручками: finalValue = (val2, log1 ++ log2) where (val1, log1) = half 8 (val2, log2) = half val1 Фу! Это ни капли не похоже на лаконичноеhalf. half $ 8 А что, если у вас есть ещё функции, имеющие лог? Напрашивается такая схема: для каждой функции, возвращающей вместе со значением лог, мы бы хотели объединять эти логи. Это побочный эффект, а никто не силён в побочных эффектах так, как монады! Читать дальше →

© Habrahabr.ru