以前这样做过吗?(Monad视图包装用于链操作的c++集合/类型)



前几天晚上,我在家里写了一些scala来取乐,我想,"如果我们在C++中有这样的API,那不是很酷吗?-有可能吗?"。我开始搜索c++、monad和stl集合,但找不到任何能真正提高我工作效率的东西:/。

因此,我开始为通常在更专用的函数语言中看到的东西实现一些概念验证(效率非常低,但至少它有效!:(。

auto m = monadic(std::vector<int>{1,2,3});
auto mMapped = m.map([](int x) {return x*x; });
Monadic<std::vector<int>> mFiltered = m.filter([](int x) {return x > 1; });
std::vector<std::string> funList = 
    monadic(src)
        .flatMap([](int x) { return std::vector<int>{1,2,3};} )
        .filter([](int x) { return x > 1; })
        .map([](int x) { return std::to_string(x).append("_string"); })
        .col;

我真的很想为我的日常c++代码(数据管理、线程和分布式执行变得如此容易(提供这样一个库(但使用移动语义更完整、更高效(。

问题是:-->你知道这样的C++11或C++14库吗<--

上面的代码使用了我放在这里的一个很快被破解的PoC库https://github.com/GiGurra/cpp_monad(用gcc 4.9.2、VS2015和clang的一些版本测试过,不记得了(。

"Monadic"类不包含任何特定的实现,它只是传递给给定集合类型可用的任何map/filter/flatMap自由函数,例如,map操作的实现非常天真,比如:

class Monadic {
public:
    ...
    template <typename MapFcn> 
    auto map(MapFcn mapFcn) { return monadic(cpp_monad::map(col, mapFcn)); }
    ...
};
// Default naive implementation in unspecialized case
template <typename T_Coll, typename T_MapFcn>
auto map(const T_Coll& src, T_MapFcn fcn) {
    std::vector<decltype(fcn(internal::_firstElem(src)))> out;
    std::transform(std::begin(src), std::end(src), std::back_inserter(out), fcn);
    return out;
};

通过这种方式,您可以替换包装器或实现,而不必使用特定的API修改代码。

只是一个想法,也许已经有了一些东西,但好多了。

看看Eric Niebler的Ranges建议和为未来C++标准建议的类似API的示例实现。

Chandler Carruth的C++Now 2014关于Range算法的演讲是关于为C++设计一个更"功能"风格的算法库的另一次尝试。

相关内容

  • 没有找到相关文章

最新更新