33 #include <boost/optional.hpp>
44 template<
template<
typename...>
class Monad,
typename... Args,
typename V>
47 return Pure<Monad, Args...> (v);
50 template<
typename MV,
typename F>
51 using BindResult_t =
typename InstanceMonad<MV>::template BindResult_t<F>;
55 template<
template<
typename...>
class Monad,
typename... Args1,
typename... Args2>
59 decltype (Init (Typelist<Args1...> {})),
60 decltype (Init (Typelist<Args2...> {}))
64 template<
typename T1,
typename T2>
71 constexpr T*
declptr () noexcept
76 template<
typename T1,
typename T2>
83 template<
typename MV,
typename F>
84 BindResult_t<MV, F>
Bind (
const MV& value,
const F&
f)
87 "Incompatible function return type");
91 template<
typename MV,
typename F>
94 return Bind (value,
f);
98 auto Do (
const MV& value)
103 template<
typename MV,
typename FHead,
typename... FArgs>
104 auto Do (
const MV& value,
const FHead& fHead,
const FArgs&... fArgs)
106 return Do (
Bind (value, fHead), fArgs...);
127 struct InstanceMonad<std::optional<T>>