平々毎々(アーカイブ)

はてなダイアリーのアーカイブです。

YコンビネータっていうかZコンビネータでラムダ式が再帰関数に変わるからフィボナッチ数も計算できる、Java8版

Java8も出たことだし、ラムダ式で頑張ってみました。

たぶんこういうことだと思いますが、詳しくはきしださんに聞いた方がいいのでしょう。

2009-04-09

下のコードはQiitaにも置きました

(追記)rec.applyRec(rec)が自分自身に名前を付けて呼び出してるからレギュレーション違反、と言われそうな気がしたので、ちょっとだけ修正。変数で受けてるのは、キャストするのがアレだな、1行が長くなるのが嫌だな、と思っただけのこと。変数で受けずに1行で書くことは可能です。

package example;

import java.util.function.*;

public class Program {
  public static void main(String[] args) {
    Function<Integer, Integer> fib
      = Y(f -> n -> n > 1 ? f.apply(n - 1) + f.apply(n - 2) : n);
    System.out.println(fib.apply(8));
  }

  static <A, R> Function<A, R> Y(Function<Function<A, R>, Function<A, R>> f) {
    Recursive<A, R> rec1 = r -> a -> f.apply(r.applyRec(r)).apply(a);
    Recursive<A, R> rec2 = r -> a -> f.apply(r.applyRec(r)).apply(a);
    return rec1.applyRec(rec2);
  }
}

@FunctionalInterface
interface Recursive<A, R> {
  public Function<A, R> applyRec(Recursive<A, R> f);
}