ラムダ式をAction<T>と組み合わせてみたら

以前やってたアレ(Action<T>を使い倒してみる - パジャマdeブロッガー(myugaruのヲタ日記))をラムダ式で表すとかなりすっきりとすることがわかった。たとえばx7のときは匿名メソッドだとこうなる。

Action<Action<Action<Action<Action<Action<Action<string>>>>>>> x7 =
delegate(Action<Action<Action<Action<Action<Action<string>>>>>> p1)
{
    p1(delegate(Action<Action<Action<Action<string>>>> p2)
    {
        p2(delegate(Action<Action<string>> p3)
        {
            p3(Console.WriteLine);
        });
    });
};
x7(delegate(Action<Action<Action<Action<Action<string>>>>> p1)
{
    p1(delegate(Action<Action<Action<string>>> p2)
    {
        p2(delegate(Action<string> p3)
        {
            p3("test");
        });
    });
});

これがラムダ式だとこうだ。やはりラムダ式は偉大である。

Action<Action<Action<Action<Action<Action<Action<string>>>>>>> x7 =
p1 => p1(p2 => p2(p3 => p3(Console.WriteLine)));
x7(p1 => p1(p2 => p2(p3 => p3("test"))));

おもしろいのでこういうのも作ってみた。さて結果は何が表示されるだろう?解読できますかな?(笑

delegate T Act<T>(T p);

static void Main(string[] args)
{
    Act<Act<Act<Act<Act<Act<Act<Act<int>>>>>>>> x8 =
        a => b => c => d => e => f => g => h => 8;
    Console.WriteLine(x8
        (a => b => c => d => e => f => g => 7)
        (a => b => c => d => e => f => 6)
        (a => b => c => d => e => 5)
        (a => b => c => d => 4)
        (a => b => c => 3)
        (a => b => 2)
        (a => 1)
        (0));
    Console.ReadLine();
}