Perl - カリー化?

http://d.hatena.ne.jp/kazu-yamamoto/20110906/1315279311

ここに書いてあることを Perl でやってみる。

定義2

カリー化 =「複数の引数を取る関数」を「一引数を取る関数のチェインに直す」こと

my $plus = sub {
    my $x = shift;
    return sub {
        my $y = shift;
        return $x + $y;
    };
};

say $plus->(1)(2); # currying!

定義3

カリー化 =「構造体を一つ取る関数」を「構造体のメンバーを複数の引数にばらし、一引数を取る関数のチェインに直す」こと

my $plus_array = sub {
    my $array_ref = shift;
    return $array_ref->[0] + $array_ref->[1];
};

say $plus_array->([1,2]);

sub curry {
    my $code_ref = shift;
    return sub {
        my $x = shift;
        return sub {
            my $y = shift;
            return $code_ref->([$x, $y]);
        };
    };
}

my $curry_plus_array = curry($plus_array);
say $curry_plus_array->(1)(2); # currying!

print Dumper [ map { $plus->(1)($_) } 1..3 ];