Как уже упоминалось, Javascript поддерживает некоторые функции высшего порядка, включая эссе от Джоэла Спольски .Марк Джейсон Доминус написал целую книгу под названием Perl высшего порядка ;исходный текст книги доступен для бесплатной загрузки в различных тонких форматах, включая PDF .
Начиная с версии Perl 3 Perl поддерживает функциональность, больше напоминающую Lisp, чем C, нотолько в Perl 5 была доступна полная поддержка замыканий и всего, что из этого следует.И ни одна из первых реализаций Perl 6 была написана на Haskell, что оказало большое влияние на прогресс в разработке этого языка.
Примеры подходов функционального программирования в Perl появляются в повседневном программировании, особенно с map
и grep
:
@ARGV = map { /\.gz$/ ? "gzip -dc < $_ |" : $_ } @ARGV;
@unempty = grep { defined && length } @many;
Поскольку sort
также допускает замыкание, шаблон map/sort/map
является очень распространенным:
@txtfiles = map { $_->[1] }
sort {
$b->[0] <=> $a->[0]
||
lc $a->[1] cmp lc $b->[1]
||
$b->[1] cmp $a->[1]
}
map { -s => $_ }
grep { -f && -T }
glob("/etc/*");
или
@sorted_lines = map { $_->[0] }
sort {
$a->[4] <=> $b->[4]
||
$a->[-1] cmp $b->[-1]
||
$a->[3] <=> $b->[3]
||
...
}
map { [$_ => reverse split /:/] } @lines;
Функция reduce
упрощает взлом списков без зацикливания:
$sum = reduce { $a + $b } @numbers;
$max = reduce { $a > $b ? $a : $b } $MININT, @numbers;
Это намного больше, но это только вкус.Замыкания упрощают создание генераторов функций, написание собственных функций высшего порядка, а не только использование встроенных функций.Фактически, одна из наиболее распространенных моделей исключений,
try {
something();
} catch {
oh_drat();
};
, является , а не встроенной.Однако, это почти тривиально, когда try
является функцией, которая принимает два аргумента: закрытие в первом аргументе и функция, которая принимает закрытие во втором.
Perl 5 не имеетесть встроенный карри, хотя для этого есть модуль.Однако в Perl 6 встроены карри и первоклассные продолжения, а также многое другое.