Comments 6
- Не уяснил причину сравнения с плюсами. Это заметно разные языки. Более логично было сравнить, с каким нибудь скриптовым языком.
- В perl есть, например, функция sort, которую можно использовать в функциональном стиле для сортировки массивов с чем угодно. Есть функция map, которую любят демонстрировать поклонники функциональной парадигмы. Автор этот момент опустил, хотя для иллюстрации они, на мой взгляд, более подходят, чем пример с замыканием.
- Сама по себе механика обратных вызовов не является признаком функциональной парадигмы, потому как давно используется в perl, например при работе с GUI.
- В чем прелесть использования FP в perl?
PS Возможно кому нибудь будет интересна книга: «Higher-Order Perl» by Mark Jason Dominus. Книга раздается в сети бесплатно, и она доступна для скачивания.
В данном случае было сравнение функционального программирования и ООП, чтобы показать, общее в ООП и в функциональном программирвовании. В данном случае не важно, на каком языке делать с ООП, главное, чтобы он его поддерживал. Например, как и описано в статье, замыкание — это аналог класса, т.е. имеет данные и состояние, либо колбек — это аналог виртуальной функции. Например, если человек знает ООП, но не знает, что такое анонимные функции, замыкания и колбеки, то в данном случае будет более просто разобраться в этих вопросах.
Полностью согласен, что sort/grep/map позволяет работать в функциональном стиле. Вопрос только в том, что блок кода в этих функциях по сути и есть замыкание, просто записаны с использования прототипа map(&@), что позволяет сначала задавать блока кода без sub, а затем массив. Пример, который иллюстрирует, что это и есть замыкание
perl -MDDP -E 'my @arr = qw/1 2 3/; sub test { my $multiplier = shift; map { $_ * $multiplier } @arr;} my @nums = test(5); p @nums'
Безусловно, функции обратного вызова не являются признаком функциональной парадигмы в общем случае, но т.к. в рамках данной статьи использовались анонимные фукнции (они же лямда-выражения) и замыкания (функции первого класса), которые относятся к функциональному программированию и зачастую используются вместе, то они и были описаны
Неблокирующее/асинхронное программирование с помощью AnyEvent/EV, Mojo::IOLoop; использование, как вы описали функций sort/grep/map, включая разные модули, например, для работы со списками List::Util, List::MoreUtils. Mojo::DOM/Web::Query — например, в функцию each передается колбек, который выполняется для каждого найденного элемента. В Dancer2/Mojolicious используются колбеки для роутинга, например, пример для Dancer2:
use Dancer2; get '/' => sub { "Hello World" }; dance;
«Higher-Order Perl» by Mark Jason Dominus. действительно очень неплохая, и рассказывает о фукнциональном программировании в Perl
В данном случае было сравнение функционального программирования и ООП, чтобы показать, общее в ООП и в функциональном программирвовании.perl не является языком ООП. Разные надстройки позволяют достаточно полно эмулировать ООП, но это только эмуляция, и поэтому я сказал о не совсем корректном сравнении.
Вопрос только в том, что блок кода в этих функциях по сути и есть замыканиене совсем согласен. Блок кода применяется к значению, что не обязывает его быть замыканием.
Веб не очень удачный пример для FP, хотя бы потому, что при рассмотрении отправки запроса и получения ответа как функции, в том смысле, как это подразумевается в FP — эта функция с побочными эффектами. При одном и том же исходом url мы можем получить разный результат.
perl не является языком ООП. Разные надстройки позволяют достаточно полно эмулировать ООП, но это только эмуляция, и поэтому я сказал о не совсем корректном сравнении.
Во-первых в данном случае было сравнение функционального программирования в Perl и ООП в C++. Во-вторых, ООП это парадигма, которая не зависит от языка, и может быть реализована в языках, которые нативно эту парадигму не искользуют (взять тот же GTK, который написан на процедурном C, но при этом является объектно-ориентированным)
не совсем согласен. Блок кода применяется к значению, что не обязывает его быть замыканием.
с эти согласен, что не блок кода не обязан быть замыканием, но т.к. он может им быть, то я и привел пример.
Веб не очень удачный пример для FP, хотя бы потому, что при рассмотрении отправки запроса и получения ответа как функции, в том смысле, как это подразумевается в FP — эта функция с побочными эффектами. При одном и том же исходом url мы можем получить разный результат.
на самом деле FP — это не только чистые функции, но и вообще оперирование функциями как значениями (передача функций как параметр, возврат функций)
auto curry = [](auto binary, auto x) {
return [=](auto y) {
return binary(x, y);
};
};
curry(mul, 3)(4); // 12
Взято из Новые возможности лямбд в C++14
Функциональное программирование на Perl в примерах