Функциональное программирование на C++, на странице 214, со ссылкой на ожидаемую монаду, которая совпадает с Haskell's Does, читает
[...] как только какая-либо из функций, к которым вы привязываетесь, вернет ошибку, выполнение остановится и вернуть эту ошибку вызывающему объекту.
Затем в заголовке чуть ниже будет написано
< blockquote>
Если вы вызываете mbind [эквивалентно Haskell >>=] для ожидаемого, содержащего ошибку, mbind даже не будет вызвать функцию преобразования; он просто перенаправит эту ошибку в результат.
что, похоже, "корректирует" то, что было написано раньше. (Я почти уверен, что либо ЛЯХ, либо RWH где-то подчеркивает, что короткого замыкания нет; если помните где, пожалуйста, напомните мне об этом.)
Действительно, насколько я понимаю, от Haskell, заключается в том, что в цепочке монадических привязок все привязки происходят реально; тогда то, что они делают с функцией, переданной им в качестве второго аргумента, зависит от конкретной монады.
В случае «Может быть» и «Либо», когда привязкам передается аргумент Nothing или Left x, затем второй аргумент игнорируется.
Тем не менее, в этих конкретных двух случаях мне интересно, есть ли снижение производительности при выполнении подобных действий
justPlus1 = Just . (+1)
turnToNothing = const Nothing
Just 3 >>= turnToNothing >>= justPlus1
>>= justPlus1
>>= justPlus1
>>= justPlus1
>>= justPlus1
поскольку в этих случаях цепочка на самом деле не может делать ничего, кроме того, что она делает, учитывая, что
Nothing >>= _ = Nothing
Left l >>= _ = Left l
Подробнее здесь: https://stackoverflow.com/questions/639 ... erformance