Я реализовал многие из этих функций (и даже ленивые, похожие на Haskell) в моем модуле List :: Gen
use List::Gen qw(zip reduce);
my @list = zip [1 .. 4], ['a' .. 'd'];
my $str = reduce {$a . $b} @list;
say $str; # 1a2b3c4d
Или используя функцию glob
для построения диапазонов:
use List::Gen 'glob';
say <1 .. 4>->zip(<a .. d>)->reduce('$a.$b'); # 1a2b3c4d
Использование ->reduce('.')
или ->reduce(sub {$a . $b})
также работает.
Или, если вы играете в гольф:
say <[.]>->(<1..4>|<a..d>);
Или для версий на Haskell см. Список :: Gen :: Haskell