Свертка

Apr 12, 2011 03:42

Похоже, я переживаю вторую волну функционализации мышления :) Первая была в 93-94гг, когда нам в школе объяснили LISP, и мы на нем делали всякие задания. Например, калькулятор рекурсивным спуском. Отголоском был годом позже спецкурс для студентов третьего курса, куда я будучи еще зеленым первокурсником храбро ходил, хотя и не все тогда получалось. ( Read more... )

программирование

Leave a comment

Функциональное программирование keyman April 12 2011, 22:15:44 UTC
Интересно! "Свертка" именуется умным термином "катаморфизм". Но я сторонник более понятных названий. Кстати, твое резюме вполне ожидаемо, тк функциональное программирование вообще входит в дискретную математику. Конечно, тебе виднее, так как у тебя по данной тематике огромный багаж, но мне, как дилетанту, императивная (а точнее процедурная) парадигма программирования видится куда более понятной и наглядной, чем парадигма функционального программирования.

Я пытался в прошлом году осилить книгу, где все объяснялось на примерах Scheme. Очень полезное чтиво, многие вещи встают на места (рекурсия в процедурном программировании никогда не была до конца понятной). Но все же это высший пилотаж, я имею ввиду использование на реальных проектах. Пожалуй, кроме Erlang`а я не слышал ни об одном языке, который бы широко использовался на прикладном уровне.

Кстати, Ruby ни разу не функциональный язык. Многое взял от Smalltalk, с его объектно-ориентированным подходом.

Обязательно пиши на такие темы! По крайней мере во мне ты найдешь благодарного читателя :)

Reply

Re: Функциональное программирование ushastyi April 13 2011, 06:59:55 UTC
Катаморфизим -- это более общее понятие, взятое из теории категорий. Я намеренно не стал о нем упоминать, чтобы не напугать :)

Меня несколько удивило твое замечание о том, что функциональное программирование -- это часть дискретной математики. На я понял откуда ноги растут, видимо, из википедии :) (http://ru.wikipedia.org/wiki/Дискретная_математика) Если рассуждать логикой тех, кто это написал, то программирование вообще -- это часть дискретной математики, поскольку алгоритм -- это дискретная структура. Преимущество же функциональной парадигмы (будем так это называть) с точки зрения математиков в том, что она наиболее строгая, что делает возможным формальную верификацию, преобразования программ и пр. Поэтому математики и специалисты по computer science "любят" функциональные языки.

Это очень хорошо, что ты попробовал разобраться в программировании на Scheme. В MIT курс программирования традиционно преподают как раз на Scheme, а не нак промышленных языках, и это, я считаю, правильно.

Возможно, про Ruby я не совсем прав, приведя его в качеств примера, он, конечно, не позиционируется как чисто функциональный язык, но функциональные возможности там присутствуют в значительном объеме. Он вообще нахватался от самых разных языков. Erlang я не стал упоминать, я так понимаю, что основное в нем -- это concurrency model, а не парадигма программирования. Ради этого он разрабатывался, и поэтому его используют. Scala, F# и его основа OCaml. используются промышленно, см. например http://www.scala-lang.org/node/1658 . Про Haskell не знаю.

Reply

Re: Функциональное программирование keyman April 13 2011, 09:31:02 UTC
Меня несколько удивило твое замечание о том, что функциональное программирование -- это часть дискретной математики. На я понял откуда ноги растут, видимо, из википедии
Угадал, оттуда.

с точки зрения математиков в том, что она наиболее строгая, что делает возможным формальную верификацию, преобразования программ и пр. Поэтому математики и специалисты по computer science "любят" функциональные языки.
Я заметил, что любят. Поясни про "формальную верификацию"!

Это очень хорошо, что ты попробовал разобраться в программировании на Scheme. В MIT курс программирования традиционно преподают как раз на Scheme, а не нак промышленных языках, и это, я считаю, правильно.
Книга как раз основана на курсе информатики MIT. Стоит озвучить ее название, вдруг кому пригодится:
"Structure and Interpretation of Computer Programs, 2nd Edition" by Harold Abelson and Gerald Jay Sussman (MIT Press, 1984)

Erlang я не стал упоминать, я так понимаю, что основное в нем -- это concurrency model, а не парадигма программирования
Ну это не делает его менее функциональным ;)

Scala, F# и его основа OCaml. используются промышленно, см. например http://www.scala-lang.org/node/1658
Не знал. Интересно. Получаются функ.языки действительно переживают второе рождение.
Как винил и ламповый звук ;)

Reply

Re: Функциональное программирование ushastyi April 13 2011, 09:58:07 UTC
Формальная верификация -- это доказательство корректности программы, доказательство в математическом смысле. Вообще говоря, любая программа -- это реализация определенного алгоритма, который в свою очередь является моделью некоторого процесса, поэтому возникает естественное желание проверить, насколько реализация совпадает с алгоритмом. Методы формальной верификации на практике используются для военных и космических программ, где ошибка может привести к катастрофе, для криптографии, сетевых протоколов и т.п. Но верифицировать функциональные программы проще по ряду причин.

Винил и ламповый звук сейчас -- это скорее мода, чем второе рождение. А функциональные языки -- это естественная реакция на усложнение задач, стоящих перед программистами. Так мне кажется.

Reply

Re: Функциональное программирование keyman April 13 2011, 10:10:13 UTC
Приличия ради скажу, что понял.

По поводу винила - соглашусь лишь отчасти, по поводу лампового звука - нет.
Ренессанс ламповой аппаратуры - скорее естественная реакция на осознание синтетической природы звука транзисторного. А мода сейчас на дешевые и "быстрые" вещи.
Мода на дешевую технику, на поверхностный стиль жизни, на средства быстрой разработки (фреймворки, IDE и тд.), мода на фастфуд. Но никак не наоборот.

Reply

Re: Функциональное программирование ushastyi April 13 2011, 10:18:00 UTC
Приличия ради скажу, что понял.

Давай я приведу пример. Пусть есть программа, которая решает квадратное уравнение. Методами формальной верификации можно установить, что:
а) программа выдаст результат для любых входных данных (то есть не зациклится)
б) программа вернет правильный результат, если уравнение имеет решение
с) программа вернет ошибку, если уравнение не имеет решения

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

Ну ладно, насчет лампы, может, ты и прав. Сильно спорить не буду :)

Reply

Re: Функциональное программирование antilamer April 13 2011, 08:02:26 UTC
Впечатление о том, что процедурная парадигма "по сути своей" более понятна - ложное, обусловленное исключительно наличием у вас бекграунда в этой парадигме и отсутствием в другой.

Если же рассуждать о том, что более понятно "по своей сути" - ну давайте рассмотрим простейший пример.

Представьте себе, что у вас есть куча документов, некоторые помечены грифом "важно" и вам нужно, чтобы ваш подчиненный подсчитал количество упоминаний вашего имени в помеченных документах. Как вы сформулируете ему задание? Будет ли ваша формулировка ближе к коду на си или к коду на хаскелле?

Псевдо-Си:

int res = 0;
for(int i = 0; i < numDocuments; i++) {
Document doc = documents[i];
if(!doc->isImportant) continue;
for(int j = 0; j < doc->numWords; j++) {
if(doc->words[j] == "keyman") res++;
}
}
return res;

Хаскелл:

count (=="keyman") [word | doc <- documents, isImportant doc, word <- words doc]

Reply

Re: Функциональное программирование ushastyi April 13 2011, 09:08:50 UTC
Ну да, ну да. Научить человека мыслить алгоритмами сложнее, чем предикатами, но почему-то все идут сложным путем, несмотря на критику. Я об этом как-то писал: http://ushastyi.livejournal.com/55150.html

Кроме MIT: http://mitpress.mit.edu/sicp/

Ваш пример на Scala:

(documents filter (_.isImportant) map (_.words) flatten) count (_=="keyman")

через свертку:

(documents filter (_.isImportant) map (_.words count (_=="keyman")) foldLeft 0)(_+_)

Через for expression, что несколько ближе к Хаскелевскому синтаксису, но на Скале выглядит коряво:

(for (doc <- documents filter (_.isImportant); word <- doc.words) yield word) count (_=="keyman")

Reply

Re: Функциональное программирование keyman April 13 2011, 09:43:07 UTC
(documents filter (_.isImportant) map (_.words) flatten) count (_=="keyman")
О! Вот это выглядит уже совсем по-человечески.
Однако осмелюсь заметить, что для подсчета вхождений больше подойдет что-нибудь менее экзотичное, LUA например. Кстатит, элегантный язык, IMHO. Но понимаю, что мы сейчас говорим не о применении, а о самой "прозрачности" парадигмы.

Reply

Re: Функциональное программирование keyman April 13 2011, 09:17:48 UTC
Шикарный пример!
И да, согласен отсутствие бекграунда объясняет однобокость восприятия.

Reply

Re: Функциональное программирование ushastyi April 13 2011, 10:21:53 UTC
Кстати, раз уж вы зашли, с большим интересом посмотрел видео с прошлогоднего доклада на ADD, все так по полочкам разложено, приятно слушать, спасибо. В этому году вы про valz собираетесь рассказывать?

Reply

Re: Функциональное программирование antilamer April 13 2011, 10:22:24 UTC
Нет, в этом году про timeplot и splot - http://jkff.info/presentations/two-visualization-tools.pdf .

Reply

Re: Функциональное программирование ushastyi April 13 2011, 12:16:24 UTC
Системные утилиты на Хаскелле -- это, конечно, сильно :) Презентация очень длинная, потом посмотрю.

Reply

Re: Функциональное программирование keyman April 14 2011, 11:28:49 UTC
Нормальная (по длине), я уже посмотрел.

Вопрос резонный: насколько оправдано использование здесь Хаскелла :)

Да, и кстати, любопытно насколько такая реализация будет работать быстрее (и съедать меньше памяти и процессорного времени), чем скажем на Lua или Python?

Lua, как мне кажется просто создан для такого рода парсинга логов и создание отчетов.

Reply

Re: Функциональное программирование antilamer April 14 2011, 13:10:25 UTC
Использование хаскела здесь для меня более чем оправдано.

Каждый раз, когда мне было нужно что-то дописать (а это было мне нужно довольно часто и срочно), я просто брал и дописывал минут за 10-20. И оно правильно работало с первой попытки - это очень типично для хаскелла. Такого никогда бы не случилось (в моих руках) ни с одним динамически типизированным языком, во всяком случае.

Я допускаю, что в руках гуру питона или гуру Lua соответственно Питон или Lua были бы так же продуктивны, как хаскелл в моих руках.

Но я замечу, что я не являюсь гуру хаскелла, и притом я могу со 100% уверенностью сказать, что если бы я писал эту утилиту на Java или C# (при том, что этими языками я владею намного более профессионально), то я бы задолбался.

Reply

Re: Функциональное программирование keyman April 14 2011, 13:54:47 UTC
Ага, такое объяснение выбора реализации очень даже устраивает. Спасибо.

Reply


Leave a comment

Up