Ho una semplice funzione flatmap
implementata in C++ per std::vector
, ma è stato suggerito che gli intervalli sono generalmente migliori. Ecco la soluzione basata vettore:Come implementare la flatmap utilizzando gli intervalli rangev3
// flatmap: [A] -> (A->[B]) -> [B]
template<typename T, typename FN>
static auto flatmap(const std::vector<T> &vec, FN fn)
-> std::vector<typename std::remove_reference<decltype(fn(T())[0])>::type> {
std::vector<typename std::remove_reference<decltype(fn(T())[0])>::type> result;
for(auto x : vec) {
auto y = fn(x);
for(auto v : y) {
result.push_back(v);
}
}
return result;
};
E 'stato anche suggerito che io uso iteratori, ma che rompe il bel componibilità della funzione:
map(filter(flatmap(V, fn), fn2), fn3)
Parto dal presupposto che in un mondo gamma-v3 sarei puntando per la scrittura di quanto sopra come:
auto result = v | flatmap(fn) | filter(fn2) | transform(fn3);
Ci si sente come flatmap
dovrebbe essere solo una combinazione banale di views::for_each
, yield_from
e transform
, ma non riesco a capire come collegarli tutti insieme.