続・名前のない再帰関数
前回のエントリー
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を定義した意味がない。