Вообще народ у нас смутно представляет другие парадигмы программирования кроме императивного и ООП (хотя наверно есть и те кто и ООП смутно представляет). Может стоит провести что-то типа ликбеза с кратким рассказом про другие парадигмы или еще какие-нибудь интересные темы пообсуждать? Системы типизации например. Как вы на это смотрите? А то скучно как то на форуме.
Сообщение отредактировал Snowm@n - Apr 10 2011, 13:19
Вообще народ у нас смутно представляет другие парадигмы программирования кроме императивного и ООП (хотя наверно есть и те кто и ООП смутно представляет). Может стоит провести что-то типа ликбеза с кратким рассказом про другие парадигмы или еще какие-нибудь интересные темы пообсуждать? Системы типизации например. Как вы на это смотрите? А то скучно как то на форуме.
Есть же инет. Лучше напиши статью на хабре и скинь ссылку сюда.
Может стоит провести что-то типа ликбеза с кратким рассказом про другие парадигмы или еще какие-нибудь интересные темы пообсуждать? Системы типизации например. Как вы на это смотрите? А то скучно как то на форуме.
Imp, ваша идея с ликбезом мне нравится. Давайте попробуем.
Imp, есть желание поближе познакомиться с функциональным программированием. С какой литературы/языка программирования рекомендуете начать знакомство? И еще вопрос, почему на ваш взгляд функциональное программирование не находит широкого применения в промышленной разработке и есть ли у него шансы занять весомую долю на рынке?
Imp, есть желание поближе познакомиться с функциональным программированием. С какой литературы/языка программирования рекомендуете начать знакомство? И еще вопрос, почему на ваш взгляд функциональное программирование не находит широкого применения в промышленной разработке и есть ли у него шансы занять весомую долю на рынке?
Ну тут есть 2 варианта - взять обычный язык с хорошей поддержкой функциональной парадигмы (например Python) и попробовать как элементы функционального программирования сочетаются на практике с более традиционным подходом. Или выбрать более тяжелый но более быстрый путь изучив чисто функциональный язык (я бы посоветовал Haskell, но можно и erlang, OCaml). Ну а насчет того что не находит широкого применения - ну это от многих факторов зависит. Видимо MS так не считает, раз они включают F# в стандартную поставку последней VS. Зависит от того что писать, я например когда пишу на Javascript во всю применяю приемы ФП: замыкания, продолжения, лямбда функции. Javascript вообще то вполне себе функциональный язык, но синтаксис там довольно бедный. Учитывая масштабы кода пишущегося сейчас на Javascript'е - можно сказать это вполне промышленный язык. На Python'е я тоже много пишу за деньги применяя функциональный подход. Книгу тяжело посоветовать, нужно хотя бы примерно знать уровень вашей теоретической подготовки. А также как у вас с английским. На русском гораздо меньше литературы (но тоже есть если поискать). Есть журнал "Практика функционального программирования" на русском, также есть переводы руководств по Хаскелю.
Imp, ваша идея с ликбезом мне нравится. Давайте попробуем.
Давайте тогда в порядке эксперимента. Постараюсь быть краток. Если нужно будет что-то подробнее объяснить я лучше на вопросы отвечу. Что такое функциональное программирование? Функциональное программирование (ФП) базируется на Лямбда исчислении Чёрча, в отличии от императивного программирования, которое базируется на концепции Машины Тьюринга. Структурное программирование и Объектно-ориентированное программирование (ООП) являются дальнейшими расширениями императивного подхода, так что все сказанное будет относится и к ним. На лямбда исчислении также базируется логическое программирование (ЛП) которые вместе с функциональным входят в класс декларативного программирования (ДП) и противопоставляются императивному. Декларативное программирование использует более математический подход к вычислениям, в то время как императивный подход более инженерный. Функциональное программирование представляет собой вычисление значений выражений, в то время как императивное - выполнение последовательных инструкций. Инструкции должны выполнятся последовательно, но выражения могут вычисляться в произвольном порядке, а некоторые подвыражения совсем не вычисляться. ФП более строго в математическом плане, тождество левой и правой части выражения не нарушается и переменные являются переменными в математическом смысле (то есть их значение нельзя изменить). Не все языки называемые функциональными являются чисто функциональными (чисто функциональные: Haskell, Clean). В чисто функциональных языках функции не имеют побочных эффектов. То есть значение функции зависит только от значений аргументов и при том же значении аргументов функция всегда возвращает то же значение. То есть у функции нет никакого внутреннего состояния. Но программа не способная вызвать побочный эффект не может и ничего сделать, ни напечатать на экран, ни прочитать файл. Для этого в Хаскелле используются Монады (из теории категорий). Они не вызывают эффект, а описывают его изменение. Это сложная тема которой я пока не буду касаться. Например если нет состояния, то не нужен и дебаггер - можно просто вызвать нужную функцию с нужными параметрами и проанализировать результат. Прочитав это большинство подумает что функциональное программирование более ограниченно, чем императивное и написать программы активно работающие с побочными эффектами на функциональном языке сложнее, но на самом деле это совсем не так. Именно из за этих ограничений ФП гораздо проще и мощнее чем императивное, но требует переосмысления своего предидущего императивного опыта. Оно позволяет решать задачи на гораздо более высоком уровне абстракции избегая проблем императивного подхода.
Ну я думаю для начала пока хватит. Если будет интерес я могу продолжить. Или предлагайте еще темы для обсуждения.
Функциональное программирование (ФП) базируется на Лямбда исчислении Чёрча, в отличии от императивного программирования, которое базируется на концепции Машины Тьюринга.
Академично, но для начала хотелось бы услышать "кухонный" язык. Еще лучше с примерами небольших программ, например, на Си и Haskell, которые показывали бы преимущества и недостатки одной парадигмы и недостатки другой.
Например, есть функция на Си:
Исходный код
int sum(int x, int y) { return x + y; }
и для нее:
Цитата
...значение функции зависит только от значений аргументов и при том же значении аргументов функция всегда возвращает то же значение. То есть у функции нет никакого внутреннего состояния.
А что будет с этим примером при функциональной парадигме?
Академично, но для начала хотелось бы услышать "кухонный" язык. Еще лучше с примерами небольших программ, например, на Си и Haskell, которые показывали бы преимущества и недостатки одной парадигмы и недостатки другой.
Например, есть функция на Си:
Исходный код
int sum(int x, int y) { return x + y; }
и для нее:А что будет с этим примером при функциональной парадигме?
будет например на Haskell:
Исходный код
sum a b = a+b
или
Исходный код
sum = (+)
или
Исходный код
sum a = (+) a
или
Исходный код
sum a b = (+) a b
Все 4 варианта абсолютно эквивалентны и дадут тот же код. При этом функции полиморфны и будут работать с любыми типами над которыми определен (+) (если функция будет экспортироватся, иначе будет выведен минимально необходимый тип). Можно ограничить и для интов написав перед функцией:
Исходный код
sum :: Int -> Int -> Int
Но систему типов пока не будем трогать. Функция у вас чистая, но компилятор об этом не знает (может конечно заинлайнить в данном случае если видит ее код. Есть еще специальные расширения gcc например чтобы указать что функция чистая, но это не по стандарту. А по стандарту если вы напишете: c1=a+b c2=a+b c3=a+b то у вас сложение вызовется 3 раза, а в Хаскелле 0 или 1 раз (в зависимости от того используется какое то из этих значений в дальнейшем или нет.
наверно для вас привычнее и так тоже можно написать, но тогда функция получится не каррированной и нужно будет передавать обязательно оба аргумента при вызове. Вообще функции в хаскелле по умолчанию каррированные, то есть если вызвать sum только с одним аргументом она вернет функцию от оставшихся. Например: inc=sum 1
Мы определили функцию inc(x) которая разворачивается в (1+x). И можем например использовать ее для увеличения всех элементов списка на 1. map inc [1,2,3]==[2,3,4] А можно просто написать: map (sum 1) [1,2,3] или map (1+) [1,2,3] Что то же самое.
Положим, что в новый стандарт Си добавили возможность объявления чистой функции (например, по аналогии с константными медотами в С++). Какие еще преимущества остаются в функциональных языках?
Если как вы говорите отбросить систему типов и чистоту, то чем функциональный пример более показательный?
Исходный код
int max(int a, int b) { return a > b ? a : b; }
Ну теперь напишите то же самое для всех возможных сочетаний типов Более читабельный он. При этом когда скомпилируется будет такой же быстрый. Вот если веток будет не 2, а например 5 - на С уже будет уже нечитабельно и неочевидно. Вообще то я тут хотел просто пример синтаксиса охранных выражений показать.
Положим, что в новый стандарт Си добавили возможность объявления чистой функции (например, по аналогии с константными медотами в С++). Какие еще преимущества остаются в функциональных языках?
Да полно преимуществ, всех и не перечислить. Вы просто не представляете насколько этот подход отличается, дело тут не в сайдэффектах. Сайдэффекты отличают только чистые ФП языки от не чистых, но и не чистые имеют очень много плюсов. Попробую перечислить: 1. Функции высшего порядка 2. Вывод типов и гораздо более мощная система типов. (не везде) 3. Ленивые вычисления. (не везде) 4. Замыкания 5. Лямбда выражения (анонимные функции) 6. Сопоставление с образцом. 7. Частичное применение. 8. Гораздо более мощный синтакис. 9. Гораздо более умный компилятор. 10. Возможность работы с бесконечными типами данных (следует из ленивых вычислений) 11. Высокоуровневый контроль над эффектами. 12. Гораздо более универсальный и пригодный для повторного использования код. 13. Меньше ошибок (гораздо больше ловится системой типов, а часть вообще невозможна из за за нестрогого порядка выполнения). 14. Мощные примитивы для работы с последовательностями. 15. Код написанный влоб и близко к постановке задачи получается при этом очень быстрым (на С надо оптимизировать). Че то пока больше не вспоминается. Но как известно целое часто больше чем сумма частей. Тут главное как все эти фичи работают вместе.