18 template<
typename T,
typename SFINAE =
void>
19 struct InstanceMonadPlus
42 return detail::IsMonadPlusImpl<T> (0);
54 auto operator() (
const MP& m1)
const
61 auto operator+ (
const MP& m1,
const MP& m2) -> decltype (
Mplus (m1) (m2))
63 return Mplus (m1) (m2);
68 template<
typename Vec>
69 auto operator() (Vec&& vec)
const
73 using MP =
typename Vec::value_type;
74 return std::accumulate (begin (vec), end (vec), Mzero<MP> (), &
operator+<MP>);
78 auto operator() (std::initializer_list<T> vec)
const
82 return std::accumulate (begin (vec), end (vec), Mzero<T> (), &
operator+<T>);
87 struct InstanceMonadPlus<std::optional<T>>
89 static std::optional<T>
Mzero ()
94 static std::optional<T>
Mplus (
const std::optional<T>& t1,
const std::optional<T>& t2)