Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
Generic Y Combinator in Java
//based on code from
class YFact {
// T function returning a T
// T -> T
public static interface Func<T> {
T apply(T n);
// Higher-order function returning a T function
// F: F -> (T -> T)
private static interface FuncToTFunc<T> {
Func<T> apply(FuncToTFunc<T> x);
//Next comes the meat. We define the Y combinator, apply it to the factorial input function, and apply the result to the input argument. The result is the factorial.
public static <T> Func<T> Y(final Func<Func<T>> r) {
return (new FuncToTFunc<T>() {
public Func<T> apply(final FuncToTFunc<T> f) {
return f.apply(f);
new FuncToTFunc<T>() {
public Func<T> apply(final FuncToTFunc<T> f) {
return r.apply(
new Func<T>() {
public T apply(T x) {
return f.apply(f).apply(x);
public static void main(String args[]) {
// Y combinator
// Recursive function generator
new Func<Func<Integer>>() {
public Func<Integer> apply(final Func<Integer> f) {
return new Func<Integer>() {
public Integer apply(Integer n) {
if (n == 0) return 1;
else return n * f.apply(n - 1);
// Argument
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.