前几天晚上,我在家里写了一些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++设计一个更"功能"风格的算法库的另一次尝试。