boost :: hana:为什么我不能过滤集合?

时间:2018-09-30 12:15:17

标签: c++ template-meta-programming boost-hana

我正在使用boost :: hana,我想过滤一个boost :: hana :: set。

#include <boost/hana.hpp>
#include <type_traits>

int main(){
    using namespace boost::hana;
    auto a = make_set(1,'a',3);
    auto b = remove_if(a, [](const auto& x){return bool_c<std::is_same_v<decltype(x), char>>;});
    // expects b to be make_set(1, 3);
}

这将导致static_assert故障。它告诉我:

static assertion failed: hana::remove_if(xs, predicate) requires 'xs' to be a MonadPlus

         static_assert(hana::MonadPlus<M>::value, 

这为什么会失败?即使定义了空集和串联操作,为什么集也不能成为MonadPlus?

1 个答案:

答案 0 :(得分:1)

如果要过滤列表,则应使用LEAD。集合的概念比MonadPlus甚至Monad更为笼统。您断言hana::tuple具有hana::sethana::concat的实现是不正确的,此外它还要求数据结构为Monad。

根据您的示例,也许您正在寻找的是hana::difference,但是hana::empty本身对此毫无用处。它的操作需要hana::set,并且不能在运行时状态下很好地发挥作用。

如果要按设置类型“过滤”设置并维护运行时值,建议使用hana::Comparable,它也支持设置操作。您可以将其键设置为其值的hana::map。这仍然需要其类型的唯一性。

这里是一个例子:

hana::type