Ovenでfoldしたい場合も<pstade/oven/numeric.hpp>のaccumulateを使います。
#include <boost/assert.hpp> #include <boost/lambda/lambda.hpp> #include <pstade/oven/initial_values.hpp> #include <pstade/oven/counting.hpp> #include <pstade/oven/numeric.hpp> namespace oven = pstade::oven; using namespace boost::lambda; int main() { // sum BOOST_ASSERT(oven::accumulate(oven::counting(1, 10 + 1), 0, _1 + _2) == 55); // product BOOST_ASSERT(oven::accumulate(oven::counting(1, 3 + 1), 1, _1 * _2) == 6); // length BOOST_ASSERT(oven::accumulate(oven::initial_values(3, 1, 4), 0, _1 + 1) == 3); }
Haskellは遅延評価があるからfoldrの方が効率いいことが多いけど
遅延評価ではない言語ではfoldlの方が効率いいんだとか。
Wikipedia - Fold(higher-order function)