C ++ 11 — это было сделано раньше? (Представление Monad, упаковывающее коллекции / типы c ++ для цепных операций)

Как-то вечером я писал для себя несколько scala дома и думал сам: «Не было бы здорово, если бы у нас был такой вид API в C ++? — Возможно ли это?». Я начал искать c ++, монады и коллекции 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.

Просто идея, возможно, что-то уже есть, но намного лучше.

7

Решение

Взгляните на ряды Эрика Ниблера предложение и образец реализация для аналогичного API, который был предложен для будущего стандарта C ++.

C ++ от Чендлера Каррута 2014 говорить Алгоритмы on Range — это еще одна попытка разработать более функциональную библиотеку стилей для C ++.

3

Другие решения


По вопросам рекламы [email protected]