template <class MonadTag, class Expr>
struct make_monadic
{
// unspecified
};
Given a monadic action of the maybe monad
MPLLIBS_METAFUNCTION(f, (N)) ((just<N>));
A metafunction for division is also given:
MPLLIBS_METAFUNCTION(maybe_divides, (A)(B)) ((just<divides<A, B>>));
To divide the result of f<int_<26>> to f<int_<2>> one has to use bind or a do block. For example:
do_c<
maybe_tag,
set<a, f<int_<26>>>,
set<b, f<int_<2>>>,
maybe_divides<a, b>
>
Writing
maybe_divides<f<int_<26>, int_<2>>>
would be invalid, since maybe_divides expects numbers and not Maybe numbers. make_monadic expects such an invalid expression and turns it into a valid monadic expression:
make_monadic<
maybe_tag,
syntax<
maybe_divides<already_monadic<f<int_<26>>>, already_monadic<f<int_<2>>>>
>
>
The subexpressions that should not be transformed should be marked with already_monadic.
#include <mpllibs/metamonad/make_monadic.hpp>
For any monad_tag tag, n > 0, f metafunction taking n arguments and t, t1, ..., tn classes the following are equivalent:
make_monadic<monad_tag, syntax<t>>::type
t::type
make_monadic<monad_tag, syntax<f<t1, ..., tn>>::type
do_c<
set<t1_, make_monadic<monad_tag, syntax<t1>>>,
// ...
set<tn_, make_monadic<monad_tag, syntax<tn>>>,
f<t1_, ..., tn_>
>::type
MPLLIBS_METAFUNCTION(f, (N)) ((just<N>));
MPLLIBS_METAFUNCTION(maybe_divides, (A)(B)) ((just<divides<A, B>>));
make_monadic<
maybe_tag,
syntax<
maybe_divides<already_monadic<f<int_<26>>>, already_monadic<f<int_<2>>>>
>
>::type
Copyright Abel Sinkovics (abel at elte dot hu) 2011. Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt