accumulateはfoldl

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)