34 #include <boost/optional.hpp> 40 template<
typename T,
typename SFINAE =
void>
64 return detail::IsMonadPlusImpl<T> (0);
76 auto operator() (
const MP& m1)
const 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>);
116 static boost::optional<T>
Mplus (
const boost::optional<T>& t1,
const boost::optional<T>& t2)
130 static std::optional<T>
Mplus (
const std::optional<T>& t1,
const std::optional<T>& t2)
static std::optional< T > Mplus(const std::optional< T > &t1, const std::optional< T > &t2)
constexpr bool IsMonadPlus()
const struct LC::Util::@1 Mplus
static boost::optional< T > Mzero()
const struct LC::Util::@2 Msum
static std::optional< T > Mzero()
static boost::optional< T > Mplus(const boost::optional< T > &t1, const boost::optional< T > &t2)
auto operator+(const MP &m1, const MP &m2) -> decltype(Mplus(m1)(m2))
constexpr bool IsMonadPlusImpl(int, typename InstanceMonadPlus< T >::UndefinedTag *=nullptr)