You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session. Dismiss alert
先週は電車通勤+歩きで仕事場を行き来したので、電車の中で、英語漬けで英語のトレーニングしてみたり、普通のHaskellプログラミング読んだりと、電車通勤はなかなか有意義なことに気付かされた。特に普通のHaskellプログラミングは第一部を読み終えたことで、高階関数と変数の束縛というものがわかったような気がした? 、、、、したのかどうかまだよくわからんので、自分の理解力を認識するために少し書いてみた。 まず、言葉の定義を。 変数の束縛 (例えば)関数という値があり、それが変数名を束縛している 高階関数 関数を返したり引数にとったりする関数 変数が関数に束縛されているから、関数を変数として扱うことが出来る? それとも関数を変数として扱うことことが出来れば高階関数はつくれるのか? 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 $plu
#!/usr/bin/env perl use 5.10.0; use strict; use warnings; sub curry { my $func = shift; my $argc = shift; my @arg1 = @_; return sub { my @arg2 = @_; if(scalar(@arg1) + scalar(@arg2) >= $argc){ return &$func(@arg1, @arg2); } return curry($func, $argc, @arg1, @arg2); } } sub add2 { my ($a,$b) = @_; return $a + $b; } my $ca = curry(\&add2, 2); say &$ca(1,2); my $ca2 = curry(\&add2, 2, 1); say &$ca2(2
以前、「JavaScript で引数束縛」において関数のカリー化を試みました。しかし、そこでカリー化された関数は、そのままでは一度しか部分適用ができず、また、最初の関数呼び出しは必ず部分適用として扱われていました。 function mean3(a, b, c) { return (a + b + c) / 3; } // 「JavaScript で引数束縛」における curry 関数。 var curriedMean3 = curry(mean3); curriedMean3(1)(2, 3); // => 2 curriedMean3(1)(2)(3); // => TypeError: curriedMean3(1)(2) is not a function // そのままでは部分適用を 2 回以上行えない。 // curry(curriedMean3(1))(2)(3) なら大丈夫
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く