23 template<
template<
typename...>
class Monad,
typename...
Args,
typename V>
29 template<
typename MV,
typename F>
34 template<
template<
typename...>
class Monad,
typename...
Args1,
typename...
Args2>
43 template<
typename T1,
typename T2>
55 template<
typename T1,
typename T2>
62 template<
typename MV,
typename F>
66 "Incompatible function return type");
70 template<
typename MV,
typename F>
105 template<
typename L,
typename R>
117 return R_t::Left (
value.GetLeft ());
119 return f (
value.GetRight ());
constexpr T * declptr() noexcept
constexpr bool IsCompatibleMonad()
constexpr bool IsCompatibleMonadImpl(const Monad< Args1... > *, const Monad< Args2... > *, int)
Container< T > Filter(const Container< T > &c, F f)
constexpr auto Init(List< Args... >)
auto operator>>(const MV &value, const F &f) -> decltype(Bind(value, f))
BindResult_t< MV, F > Bind(const MV &value, const F &f)
typename InstanceMonad< MV >::template BindResult_t< F > BindResult_t
static BindResult_t< F > Bind(const Either< L, R > &value, const F &f)
std::result_of_t< F(R)> BindResult_t
std::result_of_t< F(T)> BindResult_t
static BindResult_t< F > Bind(const std::optional< T > &value, const F &f)