flatmap
私はC++ で実装された非常に単純な関数を持っstd::vector
ていますが、範囲は一般的に優れていることが示唆されています。ベクトルベースのソリューションは次のとおりです。
// 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;
};
イテレータを使用することも提案されていますが、それは関数の素晴らしい構成可能性を壊します:
map(filter(flatmap( V, fn), fn2), fn3)
range-v3 の世界では、上記を次のように書くことを目指していると思います。
auto result = v | flatmap(fn) | filter(fn2) | transform(fn3);
、flatmap
、 の些細な組み合わせであるべきだと思いますが、それらをすべて組み合わせる方法を見つけるのに苦労しています。views::for_each
yield_from
transform