我正在使用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?
答案 0 :(得分:1)
如果要过滤列表,则应使用LEAD
。集合的概念比MonadPlus甚至Monad更为笼统。您断言hana::tuple
具有hana::set
或hana::concat
的实现是不正确的,此外它还要求数据结构为Monad。
根据您的示例,也许您正在寻找的是hana::difference
,但是hana::empty
本身对此毫无用处。它的操作需要hana::set
,并且不能在运行时状态下很好地发挥作用。
如果要按设置类型“过滤”设置并维护运行时值,建议使用hana::Comparable
,它也支持设置操作。您可以将其键设置为其值的hana::map
。这仍然需要其类型的唯一性。
这里是一个例子:
hana::type