首页 > 解决方案 > 如何使 std::vector 在 Boost.Hana 中成为 Applicative 而不先使其成为 Monad?

问题描述

根据标题,我想了解如何制作但不是std::vector(嗯,还没有)。这只是为了探索和理解Boost.Hana和函数式编程。ApplicativeMonad

Functor

hana/ext/std/vector.hpp中,Functor实例std::vector被注释掉了,但是,如果我取消注释或将其复制到我的代码中,它似乎可以正常工作(编译器资源管理器)。

Applicative

但是,那里没有代码可以使它成为 a Applicative(反过来,也没有使它成为 a Monad),所以我已经研究了hana/concept/applicative.hpp自己必须实现什么才能做到这一点。它需要和的_impl表示。aplift

结果

乍一看,我认为它有效,因为在这个简单的情况下(编译器资源管理器)它确实给出了正确的结果:

int main()
{
    auto vplus = std::vector{std::plus<int>{}};
    auto vec = hana::ap(
            std::vector{std::plus<int>{}}, // wrapping 1 object in a vector
            std::vector<int>{10,20},
            std::vector<int>{1,2});
    BOOST_HANA_RUNTIME_ASSERT(vec == std::vector<int>{11,12,21,22});
}

失望

但是我在我的解决方案中看到了一些弱点:

对于hana::tuple(或者std::tuple如果我为它定义了所需的实例),这是小菜一碟,因为它可以容纳异构类型:

     // TUPLE EXAMPLE
    auto tuple = hana::ap(
            hana::make_tuple(std::plus<int>{}, std::minus<>{}),
            hana::make_tuple(10,20),
            hana::make_tuple(1,2));
    BOOST_HANA_RUNTIME_ASSERT(tuple == hana::make_tuple(11,12,21,22,9,8,19,18));

我的问题

有没有办法以适合的std::vector方式Applicative制作?// TUPLE EXAMPLEstd::vector

可能std::function和/或类型擦除是完成任务所必需的?

标签: c++functional-programmingc++17monadsboost-hana

解决方案


推荐阅读