結果表示用関数
sub p{
my ($f,@args) = @_;
my @r = ($main::{$f}->(@args));
printf "$f -> %s\n", join(',',@r);
}
foldlを使って各値を出す
- sum: リストの合計
- max: リストの最大値
- min: リストの最小値
- length: リストの長さ
sub foldl{
my ($f,$init,@list) = @_;
my ($x,@rest) = @list;
return $init unless defined $x;
foldl($f,$f->($init,$x),@rest);
}
sub sum{foldl(sub{$_[0]+$_[1]},0,@_)}
sub max{foldl(sub{$_[0]>$_[1] ? $_[0] : $_[1]},shift,@_)}
sub min{foldl(sub{$_[0]<$_[1] ? $_[0] : $_[1]},shift,@_)}
sub length{foldl(sub{$_[0]+1},0,@_)}
p 'sum',(1,2,3,4);
p 'max',(1,4,3,2);
p 'min',(3,2,1,4);
p 'length',(1,2,3,4);
配列の連結と逆順にする関数
sub append{ @_ }
sub reverse{
my ($x,@rest) = @_;
return () unless defined $x;
(reverse(@rest),$x);
}
p 'append',((1,2,3,4),(2,3,4,5));
p 'reverse',(1,2,3);
出力
sum -> 10
max -> 4
min -> 1
length -> 4
reverse -> 3,2,1
append -> 1,2,3,4,2,3,4,5