18 template<
typename T,
typename SFINAE =
void>
54 auto operator() (
const MP& m1)
const
56 return [m1] (
const MP& m2) {
return InstanceMonadPlus<MP>::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>);
89 static std::optional<T>
Mzero ()
94 static std::optional<T>
Mplus (
const std::optional<T>& t1,
const std::optional<T>& t2)
constexpr bool IsMonadPlusImpl(int, typename InstanceMonadPlus< T >::UndefinedTag *=nullptr)
const struct LC::Util::@020013205074047223041227127047143014346053052311 Msum
constexpr bool IsMonadPlus()
const struct LC::Util::@317047151247310065044340107257146304325272176252 Mplus
constexpr auto operator+(RawStr< N1, Char > s1, CtString< N2, Char > s2) noexcept
static std::optional< T > Mplus(const std::optional< T > &t1, const std::optional< T > &t2)
static std::optional< T > Mzero()