34 #include <boost/optional.hpp>
40 template<
typename T,
typename SFINAE =
void>
41 struct InstanceMonadPlus
64 return detail::IsMonadPlusImpl<T> (0);
76 auto operator() (
const MP& m1)
const
83 auto operator+ (
const MP& m1,
const MP& m2) -> decltype (
Mplus (m1) (m2))
85 return Mplus (m1) (m2);
90 template<
typename Vec>
91 auto operator() (Vec&& vec)
const
95 using MP =
typename Vec::value_type;
96 return std::accumulate (begin (vec), end (vec), Mzero<MP> (), &
operator+<MP>);
100 auto operator() (
const std::initializer_list<T>& vec)
const
104 return std::accumulate (begin (vec), end (vec), Mzero<T> (), &
operator+<T>);
109 struct InstanceMonadPlus<
boost::optional<T>>
111 static boost::optional<T>
Mzero ()
116 static boost::optional<T>
Mplus (
const boost::optional<T>& t1,
const boost::optional<T>& t2)
125 static std::optional<T>
Mzero ()
130 static std::optional<T>
Mplus (
const std::optional<T>& t1,
const std::optional<T>& t2)