*combos = foldr_c( \&outer_prod, [[]] ); sub outer_prod { my ($xs, $ys) = @_; [ map do { my $x=$_; map [$x, @$_], @$ys }, @$xs ]; } say combos( ['a','b'], [1,2,3] ); # [['a',1],['a',2],['a',3],['b',1],['b',2],['b',3]]