Есть ли в Perl такие функции, как zip и fold? - PullRequest
4 голосов
/ 02 февраля 2012

Я хочу использовать некоторые функции, такие как "zip" , "fold" и "map" в perl. (Так же, как в Haskell.) Я нашел карту, и она хорошо работает. Тогда есть ли застежка-молния? Большое спасибо.

Ответы [ 4 ]

10 голосов
/ 02 февраля 2012

Библиотека List::Util включает в себя reduce(), что, по сути, делает fold.

List::MoreUtils содержит функцию zip().

Ни один из них не является встроенным, в основном потому, что Perl не является функциональным языком программирования.

8 голосов
/ 02 февраля 2012

Я реализовал многие из этих функций (и даже ленивые, похожие на 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

5 голосов
/ 02 февраля 2012

Если вы заинтересованы в использовании концепций функционального программирования на Perl, я настоятельно рекомендую вам прочитать Perl высшего порядка .

2 голосов
/ 03 февраля 2012

Модули, которые предоставляют функциональные инструменты программирования:

Возможно, вас заинтересует (теперь бесплатно скачать) книга Высший порядокPerl .

...