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

use*_*422 7 c++ monads functional-programming c++11 c++14

那天晚上我在家里写了一些scala,并且认为自己,"如果我们在C++中使用这种API,那会不会很酷? - 有可能吗?".我开始搜索c ++,monads和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;
Run Code Online (Sandbox Code Playgroud)

对于我的日常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;
};
Run Code Online (Sandbox Code Playgroud)

这样,您可以替换包装器或实现,而无需使用特定API修改代码.

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

mat*_*ort 3

查看 Eric Niebler 的 Ranges提案以及针对未来 C++ 标准提出的类似 API 的示例实现。

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