#!/usr/bin/perl use v5.40; sub sum( @numbers ) { my $sum_num = 0; foreach my $num (@numbers) { $sum_num = $sum_num + $num } return $sum_num } sub fold( $func, $initial, @list ) { my $output = $initial; foreach my $item (@list) { $output = $func->($output, $item); } return $output } sub mmap( $func, @list ) { my @output; foreach my $item (@list) { my $result = $func->($item); push(@output, $result); } return @output; } sub map2( $func, @list1, @list2 ) { my @output; my $list1_length = $#list1; my $list2_length = $#list2; my $length = $list1_length; if($list2_length < $length) { $length = $list2_length; } for(my $i = 0; $i < $length; $i++) { push(@output, $func->(@list1[$i], @list2[$i])); } return @output; } sub sum_op( $a, $b ) { return $a + $b } sub sum_op_2( $a ) { return $a * 2; } sub diff_op( $a, $b ) { return $a - $b; } my @test = (1,2,3,4,5,6,7,8,9,10); print(fold(\&sum_op, 0, @test)); print(mmap(\&sum_op_2, @test)); print(map2(\&diff_op, @test, @test));