mpc
Haskell-like feature supports in C++
class.hpp
Go to the documentation of this file.
1
2#pragma once
4
5namespace mpc {
6 // monad_trans
7 // https://hackage.haskell.org/package/transformers-0.6.0.2/docs/Control-Monad-Trans-Class.html
8
10 template <class>
12
13 template <class TR>
14 concept monad_trans = requires {
16 };
17
18 // Methods required for the class definition.
19
20 namespace detail {
22 template <class TR>
23 struct lift_op {
24 template <class M>
25 constexpr auto operator()(M&& m) const noexcept(
26 noexcept( monad_trans_traits<std::remove_cvref_t<TR>>::lift(std::forward<M>(m))))
27 -> decltype(monad_trans_traits<std::remove_cvref_t<TR>>::lift(std::forward<M>(m)))
28 { return monad_trans_traits<std::remove_cvref_t<TR>>::lift(std::forward<M>(m)); }
29 };
30 } // namespace detail
31
32 inline namespace cpo {
34 template <class TR>
35 inline constexpr partial<detail::lift_op<TR>> lift{};
36 } // namespace cpo
37} // namespace mpc
constexpr partial< detail::lift_op< TR > > lift
lift :: (Monad m) => m a -> t m a
Definition: class.hpp:35
lift :: (Monad m) => m a -> t m a
Definition: class.hpp:23
class (forall m. Monad m => Monad (t m)) => MonadTrans t where
Definition: class.hpp:11
Implements a perfect-forwarding call wrapper.
Definition: partial.hpp:63