RosettaCodeData/Task/Y-combinator/C++/y-combinator-1.cpp

44 lines
1,015 B
C++
Raw Permalink Normal View History

2013-04-11 01:07:29 -07:00
#include <iostream>
#include <functional>
template <typename F>
struct RecursiveFunc {
std::function<F(RecursiveFunc)> o;
};
template <typename A, typename B>
2015-02-20 00:35:01 -05:00
std::function<B(A)> Y (std::function<std::function<B(A)>(std::function<B(A)>)> f) {
2013-04-11 01:07:29 -07:00
RecursiveFunc<std::function<B(A)>> r = {
std::function<std::function<B(A)>(RecursiveFunc<std::function<B(A)>>)>([f](RecursiveFunc<std::function<B(A)>> w) {
return f(std::function<B(A)>([w](A x) {
return w.o(w)(x);
}));
})
};
return r.o(r);
}
typedef std::function<int(int)> Func;
typedef std::function<Func(Func)> FuncFunc;
FuncFunc almost_fac = [](Func f) {
return Func([f](int n) {
if (n <= 1) return 1;
return n * f(n - 1);
});
};
FuncFunc almost_fib = [](Func f) {
return Func([f](int n) {
if (n <= 2) return 1;
return f(n - 1) + f(n - 2);
});
};
int main() {
2015-02-20 00:35:01 -05:00
auto fib = Y(almost_fib);
auto fac = Y(almost_fac);
2013-04-11 01:07:29 -07:00
std::cout << "fib(10) = " << fib(10) << std::endl;
std::cout << "fac(10) = " << fac(10) << std::endl;
return 0;
}