18 template<
typename T,
typename SFINAE =
void>
42 return detail::IsMonadPlusImpl<T> (0);
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::@1 Mplus
constexpr bool IsMonadPlus()
auto operator+(const MP &m1, const MP &m2) -> decltype(Mplus(m1)(m2))
const struct LC::Util::@2 Msum
static std::optional< T > Mplus(const std::optional< T > &t1, const std::optional< T > &t2)
static std::optional< T > Mzero()