9 Страницы  1 2 3 > »   
Ответить Создать тему

Функциональное программирование

Imp
post Nov 17 2009, 08:02 
Отправлено #1


Ъ

Сообщений: 4 518
Из: Пуэрто-Принцеса



Вообще народ у нас смутно представляет другие парадигмы программирования кроме императивного и ООП (хотя наверно есть и те кто и ООП смутно представляет). Может стоит провести что-то типа ликбеза с кратким рассказом про другие парадигмы или еще какие-нибудь интересные темы пообсуждать? Системы типизации например. Как вы на это смотрите? А то скучно как то на форуме.

Сообщение отредактировал Snowm@n - Apr 10 2011, 13:19
Profile CardPM
  0/0  
itROOT
post Nov 18 2009, 02:52 
Отправлено #2


Постоялец

Сообщений: 295



Цитата(Imp @ Nov 17 2009, 08:02)
Вообще народ у нас смутно представляет другие парадигмы программирования кроме императивного и ООП (хотя наверно есть и те кто и ООП смутно представляет). Может стоит провести что-то типа ликбеза с кратким рассказом про другие парадигмы или еще какие-нибудь интересные темы пообсуждать? Системы типизации например. Как вы на это смотрите? А то скучно как то на форуме.
*


Есть же инет. Лучше напиши статью на хабре и скинь ссылку сюда.
Profile CardPM
  0/0  
Imp
post Nov 18 2009, 08:53 
Отправлено #3


Ъ

Сообщений: 4 518
Из: Пуэрто-Принцеса



Цитата(itROOT @ Nov 18 2009, 02:52)
Есть же инет. Лучше напиши статью на хабре и скинь ссылку сюда.
*

На хабр инвайт нужен. И на хабре нужно большую статью писать. А я думал о чем то типа небольших постов как раз для форума. Хотя есть у меня одна идея.
Profile CardPM
  0/0  
Guest
post Nov 21 2009, 22:46 
Отправлено #4


Unregistered





Цитата(Imp @ Nov 17 2009, 08:02)
Может стоит провести что-то типа ликбеза с кратким рассказом про другие парадигмы или еще какие-нибудь интересные темы пообсуждать? Системы типизации например. Как вы на это смотрите? А то скучно как то на форуме.
*
Imp, ваша идея с ликбезом мне нравится. Давайте попробуем.
  0/0  
Guest
post Nov 21 2009, 22:52 
Отправлено #5


Unregistered





Imp, есть желание поближе познакомиться с функциональным программированием. С какой литературы/языка программирования рекомендуете начать знакомство? И еще вопрос, почему на ваш взгляд функциональное программирование не находит широкого применения в промышленной разработке и есть ли у него шансы занять весомую долю на рынке?
  0/0  
Imp
post Nov 22 2009, 01:12 
Отправлено #6


Ъ

Сообщений: 4 518
Из: Пуэрто-Принцеса



Цитата(Guest @ Nov 21 2009, 22:52)
Imp, есть желание поближе познакомиться с функциональным программированием. С какой литературы/языка программирования рекомендуете начать знакомство? И еще вопрос, почему на ваш взгляд функциональное программирование не находит широкого применения в промышленной разработке и есть ли у него шансы занять весомую долю на рынке?
*

Ну тут есть 2 варианта - взять обычный язык с хорошей поддержкой функциональной парадигмы (например Python) и попробовать как элементы функционального программирования сочетаются на практике с более традиционным подходом. Или выбрать более тяжелый но более быстрый путь изучив чисто функциональный язык (я бы посоветовал Haskell, но можно и erlang, OCaml).
Ну а насчет того что не находит широкого применения - ну это от многих факторов зависит. Видимо MS так не считает, раз они включают F# в стандартную поставку последней VS. Зависит от того что писать, я например когда пишу на Javascript во всю применяю приемы ФП: замыкания, продолжения, лямбда функции. Javascript вообще то вполне себе функциональный язык, но синтаксис там довольно бедный. Учитывая масштабы кода пишущегося сейчас на Javascript'е - можно сказать это вполне промышленный язык. На Python'е я тоже много пишу за деньги применяя функциональный подход.
Книгу тяжело посоветовать, нужно хотя бы примерно знать уровень вашей теоретической подготовки. А также как у вас с английским. На русском гораздо меньше литературы (но тоже есть если поискать).
Есть журнал "Практика функционального программирования" на русском, также есть переводы руководств по Хаскелю.

Сообщение отредактировал Imp - Nov 22 2009, 01:26
Profile CardPM
  0/0  
Imp
post Nov 22 2009, 08:05 
Отправлено #7


Ъ

Сообщений: 4 518
Из: Пуэрто-Принцеса



Цитата(Guest @ Nov 21 2009, 22:46)
Imp, ваша идея с ликбезом мне нравится. Давайте попробуем.
*

Давайте тогда в порядке эксперимента. Постараюсь быть краток. Если нужно будет что-то подробнее объяснить я лучше на вопросы отвечу.
Что такое функциональное программирование?
Функциональное программирование (ФП) базируется на Лямбда исчислении Чёрча, в отличии от императивного программирования, которое базируется на концепции Машины Тьюринга. Структурное программирование и Объектно-ориентированное программирование (ООП) являются дальнейшими расширениями императивного подхода, так что все сказанное будет относится и к ним. На лямбда исчислении также базируется логическое программирование (ЛП) которые вместе с функциональным входят в класс декларативного программирования (ДП) и противопоставляются императивному.
Декларативное программирование использует более математический подход к вычислениям, в то время как императивный подход более инженерный. Функциональное программирование представляет собой вычисление значений выражений, в то время как императивное - выполнение последовательных инструкций. Инструкции должны выполнятся последовательно, но выражения могут вычисляться в произвольном порядке, а некоторые подвыражения совсем не вычисляться.
ФП более строго в математическом плане, тождество левой и правой части выражения не нарушается и переменные являются переменными в математическом смысле (то есть их значение нельзя изменить).
Не все языки называемые функциональными являются чисто функциональными (чисто функциональные: Haskell, Clean). В чисто функциональных языках функции не имеют побочных эффектов. То есть значение функции зависит только от значений аргументов и при том же значении аргументов функция всегда возвращает то же значение. То есть у функции нет никакого внутреннего состояния.
Но программа не способная вызвать побочный эффект не может и ничего сделать, ни напечатать на экран, ни прочитать файл. Для этого в Хаскелле используются Монады (из теории категорий). Они не вызывают эффект, а описывают его изменение. Это сложная тема которой я пока не буду касаться.
Например если нет состояния, то не нужен и дебаггер - можно просто вызвать нужную функцию с нужными параметрами и проанализировать результат.
Прочитав это большинство подумает что функциональное программирование более ограниченно, чем императивное и написать программы активно работающие с побочными эффектами на функциональном языке сложнее, но на самом деле это совсем не так. Именно из за этих ограничений ФП гораздо проще и мощнее чем императивное, но требует переосмысления своего предидущего императивного опыта. Оно позволяет решать задачи на гораздо более высоком уровне абстракции избегая проблем императивного подхода.

Ну я думаю для начала пока хватит. Если будет интерес я могу продолжить. Или предлагайте еще темы для обсуждения.
Profile CardPM
  0/0  
Guest
post Nov 22 2009, 11:44 
Отправлено #8


Unregistered





Цитата
Функциональное программирование (ФП) базируется на Лямбда исчислении Чёрча, в отличии от императивного программирования, которое базируется на концепции Машины Тьюринга.
Академично, но для начала хотелось бы услышать "кухонный" язык. Еще лучше с примерами небольших программ, например, на Си и Haskell, которые показывали бы преимущества и недостатки одной парадигмы и недостатки другой.

Например, есть функция на Си:
Исходный код

int sum(int x, int y)
{
   return x + y;
}

и для нее:
Цитата
...значение функции зависит только от значений аргументов и при том же значении аргументов функция всегда возвращает то же значение. То есть у функции нет никакого внутреннего состояния.
А что будет с этим примером при функциональной парадигме?
  0/0  
Imp
post Nov 22 2009, 12:43 
Отправлено #9


Ъ

Сообщений: 4 518
Из: Пуэрто-Принцеса



Цитата(Guest @ Nov 22 2009, 11:44)
Академично, но для начала хотелось бы услышать "кухонный" язык. Еще лучше с примерами небольших программ, например, на Си и 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 раз (в зависимости от того используется какое то из этих значений в дальнейшем или нет.
Profile CardPM
  0/0  
Imp
post Nov 22 2009, 12:54 
Отправлено #10


Ъ

Сообщений: 4 518
Из: Пуэрто-Принцеса



запись
Исходный код
sum (a,b)=a+b

наверно для вас привычнее и так тоже можно написать, но тогда функция получится не каррированной и нужно будет передавать обязательно оба аргумента при вызове. Вообще функции в хаскелле по умолчанию каррированные, то есть если вызвать 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]
Что то же самое.
Profile CardPM
  0/0  
Imp
post Nov 22 2009, 14:01 
Отправлено #11


Ъ

Сообщений: 4 518
Из: Пуэрто-Принцеса



Вот немного более показательный пример функция max:
Исходный код

max a b | a>b = a
        | otherwise = b

или
Исходный код

max a b | a>b = a
max a b = b


Сообщение отредактировал Imp - Nov 22 2009, 14:02
Profile CardPM
  0/0  
Guest
post Nov 22 2009, 14:21 
Отправлено #12


Unregistered





Если как вы говорите отбросить систему типов и чистоту, то чем функциональный пример более показательный?
Исходный код
int max(int a, int b)
{
   return a > b ? a : b;
}
  0/0  
Guest
post Nov 22 2009, 14:26 
Отправлено #13


Unregistered





Положим, что в новый стандарт Си добавили возможность объявления чистой функции (например, по аналогии с константными медотами в С++). Какие еще преимущества остаются в функциональных языках?
  0/0  
Imp
post Nov 22 2009, 14:31 
Отправлено #14


Ъ

Сообщений: 4 518
Из: Пуэрто-Принцеса



Цитата(Guest @ Nov 22 2009, 14:21)
Если как вы говорите отбросить систему типов и чистоту, то чем функциональный пример более показательный?
Исходный код
int max(int a, int b)
{
   return a > b ? a : b;
}

*

Ну теперь напишите то же самое для всех возможных сочетаний типов smile.gif Более читабельный он. При этом когда скомпилируется будет такой же быстрый. Вот если веток будет не 2, а например 5 - на С уже будет уже нечитабельно и неочевидно. Вообще то я тут хотел просто пример синтаксиса охранных выражений показать.
Profile CardPM
  0/0  
Imp
post Nov 22 2009, 14:45 
Отправлено #15


Ъ

Сообщений: 4 518
Из: Пуэрто-Принцеса



Цитата(Guest @ Nov 22 2009, 14:26)
Положим, что в новый стандарт Си добавили возможность объявления чистой функции (например, по аналогии с константными медотами в С++). Какие еще преимущества остаются в функциональных языках?
*

Да полно преимуществ, всех и не перечислить. Вы просто не представляете насколько этот подход отличается, дело тут не в сайдэффектах. Сайдэффекты отличают только чистые ФП языки от не чистых, но и не чистые имеют очень много плюсов.
Попробую перечислить:
1. Функции высшего порядка
2. Вывод типов и гораздо более мощная система типов. (не везде)
3. Ленивые вычисления. (не везде)
4. Замыкания
5. Лямбда выражения (анонимные функции)
6. Сопоставление с образцом.
7. Частичное применение.
8. Гораздо более мощный синтакис.
9. Гораздо более умный компилятор.
10. Возможность работы с бесконечными типами данных (следует из ленивых вычислений)
11. Высокоуровневый контроль над эффектами.
12. Гораздо более универсальный и пригодный для повторного использования код.
13. Меньше ошибок (гораздо больше ловится системой типов, а часть вообще невозможна из за за нестрогого порядка выполнения).
14. Мощные примитивы для работы с последовательностями.
15. Код написанный влоб и близко к постановке задачи получается при этом очень быстрым (на С надо оптимизировать).
Че то пока больше не вспоминается. Но как известно целое часто больше чем сумма частей. Тут главное как все эти фичи работают вместе.
Profile CardPM
  0/+1  

9 Страницы  1 2 3 > » 
ОтветитьTopic Options
1 чел. читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
Быстрый ответ
Кнопки кодов
 Расширенный режим
 Нормальный режим
    Закрыть все тэги


Открытых тэгов: 
Введите сообщение
Смайлики
smilie  smilie  smilie  smilie  smilie 
smilie  smilie  smilie  smilie  smilie 
smilie  smilie  smilie  smilie  smilie 
smilie  smilie  smilie  smilie  smilie 
smilie  smilie  smilie  smilie  smilie 
smilie  smilie  smilie  smilie  smilie 
         
Показать все

Опции сообщения