/* @copyright Louis Dionne 2014 Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) */ #include #include #include #include #include #include #include using namespace boost::hana; BOOST_HANA_CONSTEXPR_LAMBDA auto fact = fix( [](auto fact, auto n) { return if_(n == int_<0>, always(int_<1>), [](auto fact, auto n) { return n * fact(n - int_<1>); } )(fact, n); } ); constexpr unsigned long long fact_test(unsigned long long n) { return n == 0 ? 1 : n * fact_test(n - 1); } int main() { //! @todo Use some kind of monadic mapping here. unpack( on([](...) { }, [](auto n) { BOOST_HANA_STATIC_ASSERT(fact(n) == fact_test(n)); return 0; }), range(size_t<0>, size_t<15>) ); }