今日の勉強メモ

結果表示用関数

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