Было упомянуто, что 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/*");
or
@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 прямо встроены каррирование и первоклассные продолжения, а также многое другое.
person
tchrist
schedule
27.04.2011