-spec return(A) -> monad(A). -spec fail(any()) -> monad(_A). -spec '>>='(monad(A), fun((A) -> monad(B))) -> monad(B).