続・名前のない再帰関数

前回のエントリー
http://d.hatena.ne.jp/kya-zinc/20091205/1259999256
を考え直した。
要するに無名関数からthis(自分自身の参照)が見えればよいので
applyの引数として渡してやる。
呼び出しにはもう一つの無名関数f => f(f)を使ってやる。

object AnonymousRec3 {
  def main(args : Array[String]) : Unit =
    {(f : Any => Unit) => f(f)}.apply({
      g : Any => 
        println("hoge")
        g.asInstanceOf[Any => Unit].apply(g)
    })
}

ラムダで書くと(\f.f(f))(\g.g(g))。バックスラッシュはラムダと思いねえ。
ただまともな型はつけられそうにないので
Anyにしておいてキャストっすかね。
呼び出すためには名前つけてもいいか。

object AnonymousRec4 {
  def main(args : Array[String]) : Unit = {
    val f : Any => Unit = { g : Any => 
      println("hoge")
      g.asInstanceOf[Any => Unit].apply(g)
    }
    f(f)
  }
}

ついでにJavaで書いてみる。

public class AnonymousRecJava {
  public static void main(String[] args) {
    new Function<Function<Object,Unit>, Unit>(){
      @Override
      public Unit apply(Function<Object, Unit> function){
        return function.apply(function);
      }
    }.apply( new Function<Object, Unit>(){
      @Override
      public Unit apply(Object object){
        Function<Object, Unit> function = (Function)object;
        return function.apply(object);
      }
    });
  }

  public interface Function<A, B> {
    B apply(A a);
  }

  public enum Unit {
    unit;
  }
}

Unitを定義した意味がない。