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

时间:2015-02-02 19:02:24

标签: c++ c++11 functional-programming monads 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;

我真的很喜欢这样一个库(但是使用移动语义更加完整和高效)我的日常c ++代码(数据管理,线程和分布式执行变得如此简单)。

问题:   - &GT;你知道C ++ 11或C ++ 14的任何这样的库吗? &LT; -

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

&#34; Monadic&#34; class不包含任何特定的实现,它只是传递给任何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修改代码。

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

1 个答案:

答案 0 :(得分:3)

查看Eric Niebler的范围proposal和样本implementation,了解为未来C ++标准提出的类似API。

Chandler Carruth的C ++ Now 2014 talk关于Range算法的另一个尝试是设计一个更具功能性的&#39; C ++的样式算法库。