Монада - это тип/трейт, на котором определены операции
bind: m a -> (a -> m b) -> m b; Option::and_then,
return: a -> m a; Some или Option::from.
Хорошие монады удовлетворяют трём монадическим законам.
Первые два: return можно скомпозировать (bind'ом) в любом порядке с произвольной функцией f (той же сигнатуры, что и у return), и результат будет тот же, что и простой вызов f. Some(x).and_then(f) = f(x).and_then(Some) = f(x).
Третье: порядок композирования не имеет влияния на результат. Достаточно вспомнить, что try-оператор можно задействовать на любом числе упакованных в Option переменных, и выражение, возвращающее Some, нельзя будет вычислить, пока во всех упаковках не будет значение.