32 #include <boost/optional.hpp> 44 template<
template<
typename...>
class Monad,
typename... Args,
typename V>
45 Monad<Args..., V>
Return (
const V& v)
47 return Pure<Monad, Args...> (v);
50 template<
typename MV,
typename F>
55 template<
template<
typename...>
class Monad,
typename... Args1,
typename... Args2>
64 template<
typename T1,
typename T2>
76 template<
typename T1,
typename T2>
83 template<
typename MV,
typename F>
87 "Incompatible function return type");
91 template<
typename MV,
typename F>
94 return Bind (value, f);
99 auto Do (
const MV& value)
104 template<
typename MV,
typename FHead,
typename... FArgs>
105 auto Do (
const MV& value,
const FHead& fHead,
const FArgs&... fArgs)
107 return Do (
Bind (value, fHead), fArgs...);
119 static BindResult_t<F>
Bind (
const boost::optional<T>& value,
const F& f)
auto operator>>(const MV &value, const F &f) -> decltype(Bind(value, f))
static BindResult_t< F > Bind(const boost::optional< T > &value, const F &f)
typename std::result_of< T >::type ResultOf_t
constexpr bool IsCompatibleMonad()
constexpr bool IsCompatibleMonadImpl(const Monad< Args1... > *, const Monad< Args2... > *, int)
typename InstanceMonad< MV >::template BindResult_t< F > BindResult_t
Monad< Args..., V > Return(const V &v)
Applicative< Args..., T > Pure(const T &v)
ResultOf_t< F(T)> BindResult_t
constexpr T * declptr() noexcept
BindResult_t< MV, F > Bind(const MV &value, const F &f)