Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> функциональное программирование в с++. зачем?! 
V
    Опции темы
boostcoder
Дата 12.6.2011, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



всем доброго дня.

прочел доку по Phoenix, поразбирал примеры, кое-что накодил... в общем все понятно. не понятно другое: как/где/зачем/почему реально применять функциональное программирование в с++ ?

в добавок прочел вики: Функциональное программирование, но ничего не прояснилось.

кто в теме, расскажите, в чем соль?

спасибо.

PM WWW   Вверх
maint
Дата 12.6.2011, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 77
Регистрация: 12.5.2008

Репутация: нет
Всего: 2



если судить по книге Д.Роджерс "Алгоритмические основы машинной графики" математики там как грязи. А графика, сечас, в основном на плюсах рисуется. Это на вскидку, что пришло в голову.
PM   Вверх
boostcoder
Дата 12.6.2011, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



maint, спасибо.
но это не объяснение и не обоснование.

Добавлено через 32 секунды
наверное нужно во флейме создать тему...
PM WWW   Вверх
afiskon
Дата 12.6.2011, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 31.3.2011
Где: Россия, Москва

Репутация: 1
Всего: 4



Как я рад, что вы спросили smile Как раз сейчас учу Haskell и совсем недавно отвечал на этот вопрос. Помимо названных трех пунктов, связанных с оптимизацией, в ФП есть еще куча приятных вещей. Например, противники goto могут возрадоваться - в ФП его нет ни в каком виде. Я лично еще замечал, что код на Haskell автоматически разбивается на небольшие функции, делающие что-то одно, полностью в соответствии с рекомендациями Макконнела. В общем, это хорошая, годная парадигма, с которой как минимум не помешает ознакомиться. Принцип чистых функций можно вполне успешно применять в С++, особенно, если вы практикуете TDD.

Это сообщение отредактировал(а) afiskon - 12.6.2011, 17:13
PM MAIL WWW   Вверх
boostcoder
Дата 12.6.2011, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(afiskon @  12.6.2011,  17:07 Найти цитируемый пост)
совсем недавно отвечал на этот вопрос

Цитата

Функциональные языки легко распараллеливают выполнение алгоритмов. Так как, если явно не указано обратное, f(a,b,c) зависит только от аргументов (нет побочных эффектов), аргументы можно вычислять параллельно.

вот, это аргумент!

Цитата(afiskon @  12.6.2011,  17:07 Найти цитируемый пост)
противники goto могут возрадоваться - в ФП есть нет ни в каком виде.

после тире, что-то не так со смыслом..


PM WWW   Вверх
afiskon
Дата 12.6.2011, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 31.3.2011
Где: Россия, Москва

Репутация: 1
Всего: 4



"в ФП его нет ни в каком виде" - исправил )
PM MAIL WWW   Вверх
Фантом
Дата 12.6.2011, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: нет
Всего: 49



Вообще-то это два разных вопроса: нужно ли функциональное программирование вообще и нужно ли оно в C++. С первым вопросом все и так понятно, а вот второй куда сложнее.
PM   Вверх
Sartorius
Дата 12.6.2011, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

Репутация: 8
Всего: 37



Цитата(Фантом @  12.6.2011,  19:23 Найти цитируемый пост)
: нужно ли функциональное программирование вообще и нужно ли оно в C++

и нужен ли C++  smile 

PM MAIL ICQ   Вверх
boostcoder
Дата 12.6.2011, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Фантом, в топике конкретный вопрос:
Цитата

функциональное программирование в с++. зачем?!

про функциональное программирование вообще, я ничего не могу сказать. да и не интересно как-то...
PM WWW   Вверх
Фантом
Дата 12.6.2011, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: нет
Всего: 49



Цитата(boostcoder @  12.6.2011,  18:32 Найти цитируемый пост)
 в топике конкретный вопрос:

Да, но уже появляются ответы на другой - например, от afiskon.
PM   Вверх
kemiisto
Дата 12.6.2011, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 2
Всего: 160



Цитата(boostcoder @  12.6.2011,  16:11 Найти цитируемый пост)
вот, это аргумент!

Человек вчера Haskell увидел. Эко... Увидел эту грязную инсинуацию в бложике такого же как он однодневного функционального программиста. Звучит-то как красиво! Перетащил. smile 

Цитата(afiskon @  12.6.2011,  16:07 Найти цитируемый пост)
Помимо названных трех пунктов, связанных с оптимизацией

Каждый из которых не годится даже для холиваров. Слишком толсто.

Цитата(afiskon @  12.6.2011,  16:07 Найти цитируемый пост)
Принцип чистых функций можно вполне успешно применять в С++, особенно, если вы практикуете TDD.

Эм... Я даже как-то растерян. 

Цитата(afiskon @  12.6.2011,  16:07 Найти цитируемый пост)
Например, противники goto могут возрадоваться - в ФП его нет ни в каком виде.

Аргумент! smile Я радуюсь и без ФП. ЧЯДНТ?


Цитата(Фантом @  12.6.2011,  17:23 Найти цитируемый пост)
Вообще-то это два разных вопроса: нужно ли функциональное программирование вообще и нужно ли оно в C++.

Цитата(Sartorius @  12.6.2011,  17:25 Найти цитируемый пост)
и нужен ли C++

Цитата(Фантом @  12.6.2011,  17:23 Найти цитируемый пост)
С первым вопросом все и так понятно, а вот второй куда сложнее.

Мне всё понятно со всеми тремя вопросами. smile 


--------------------
PM MAIL WWW GTalk Jabber   Вверх
volatile
Дата 13.6.2011, 02:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(Sartorius @ 12.6.2011,  18:25)
Цитата(Фантом @  12.6.2011,  19:23 Найти цитируемый пост)
: нужно ли функциональное программирование вообще и нужно ли оно в C++

и нужен ли C++  smile

И нужно ли вообще программирование?  smile


PM MAIL   Вверх
borisbn
Дата 13.6.2011, 06:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Небольшой  smile
 как-то давно (ещё в институте) изучали prolog. Мне понравилось, как там решалась задача с перевозкой козы, капусты и волка через речку: описание алгоритма отсутствовало, описывались лишь правила: этот не может быть с этим, а этот с этим. И указывалось, что лодочник может взять лишь один "предмет". Всё. Дальше говорилось что-то типа "Старт" и программа сама находила алгоритм перевозки. 
Потом я понял, что ФП не для джедаев/программистов, т.к. у них в голове одни алгоритмы. Это, скорее, для чистых математиков/физиков/химиков (kemiisto - hi smile )


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
boostcoder
Дата 13.6.2011, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(borisbn @  13.6.2011,  06:59 Найти цитируемый пост)
что ФП не для джедаев/программистов, т.к. у них в голове одни алгоритмы. Это, скорее, для чистых математиков/физиков/химиков

ну хз... я что-то в доке ничего такого не обнаружил.. только конструирование объектов.
PM WWW   Вверх
sergioK1
Дата 14.6.2011, 15:20 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 30.1.2011

Репутация: нет
Всего: нет



Я лично не понимаю вопроса, ФП нужно там где задача не требует обьектов, т,е, из не надо изобретать 
потому что это модно,  

с другой стороны static чем не фп ,

подобные вопросы обычно возникают у тех кто не умеет писать  хороший код ,  и думают что если ООП то багов нету 

Это сообщение отредактировал(а) sergioK1 - 14.6.2011, 18:11
PM MAIL   Вверх
boostcoder
Дата 14.6.2011, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(sergioK1 @  14.6.2011,  15:20 Найти цитируемый пост)
подобные вопросы обычно возникают у тех кто не умеет писать  хороший код ,  и думают что если ООП то багов нету

у меня к тебе был всего один вопрос: гадков-то тебе сколько?
PM WWW   Вверх
baldina
Дата 14.6.2011, 16:14 (ссылка) |    (голосов:6) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Цитата(boostcoder @  12.6.2011,  17:11 Найти цитируемый пост)
Цитата

Функциональные языки легко распараллеливают выполнение алгоритмов. Так как, если явно не указано обратное, f(a,b,c) зависит только от аргументов (нет побочных эффектов), аргументы можно вычислять параллельно.

вот, это аргумент!

совсем не аргумент. ибо в С++ никакой параллельности нет)))

Цитата(borisbn @  13.6.2011,  06:59 Найти цитируемый пост)
я понял, что ФП не для джедаев/программистов, т.к. у них в голове одни алгоритмы

Вы путаете логическое программирование и функциональное. В Prolog работает машина вывода, в ФП этого нет. В ФП те же самые алгоритмы.

Как это реализуется.
Функционально можно программировать на любом языке, где есть рекурсия.
На языке, где передача аргументов производится по значению, это удобнее.
На языке, где можно реализовать функции высших порядков (принимающие функции в качестве аргументов), это удобнее.
На языке, где можно создавать неименованные функции в месте вызова (лямбда-функции), это удобнее.
Все это можно с успехом делать на С++.
Есть еще несколько вещей, которые традиционно присутствуют в Ф-языках и связываются с ФП - карринг, ленивые вычисления, оптимизация хвостовой рекурсии, сопоставление с образцом (сигнатурой). Многое из этого можно с разной степенью удобства моделировать в С++.

Зачем все это нужно.
Функциональные алгоритмы (рекурсивные) часто проще для понимания и реализации.
Ф алгоритмы часто более кратки, чем их императивные аналоги.
ФП является более надежным, т.к. работает с константами, а не переменными. Т.е. не нужно искать, где переменная могла быть модифицирована.

Как(когда) это применять.
ФП - парадигма, поэтому для его использования надо встать на определенную точку зрения. Основой этой точки зрения, на мой взгляд, является вычисление функции (это тривиальное объяснение) и применение функции к данным(аргументам).
Функциональный взгляд проявляется в конструкциях типа
Код

apply(bind1st(contact, ";"), List({1,2,3,4,5}).filter([](auto x){ return x%2 == 0; }).map(toString));

- преобразование четных элементов списка в строку, где элементы разделены точкой с запятой.

Реальные программы, конечно, не могут быть чисто функциональными, т.к. должны генерировать побочные эффекты в виде ввода/вывода, но основной идее это не мешает.
Удобно и продуктивно совмещать различные парадигмы в рамках одного проекта.
Почитайте про язык Scala: Java-подобный синтаксис, в целом близкий программистам на С++, объединение парадигм функционального, объектно-ориентированного, аспектно-ориентированного и обобщенного программирования. В статьях и книжке авторов языка приводится масса задач и примеров, из которых видны преимущества такого симбиоза, там же объясняются преимущества функционального подхода. Да они и из кода видны сразу.

Это сообщение отредактировал(а) baldina - 14.6.2011, 16:17
PM MAIL   Вверх
boostcoder
Дата 14.6.2011, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



baldina, спасибо.

Цитата(baldina @  14.6.2011,  16:14 Найти цитируемый пост)
Почитайте про язык Scala: Java-подобный синтаксис, в целом близкий программистам на С++, объединение парадигм функционального, объектно-ориентированного, аспектно-ориентированного и обобщенного программирования. В статьях и книжке авторов языка приводится масса задач и примеров, из которых видны преимущества такого симбиоза, там же объясняются преимущества функционального подхода. Да они и из кода видны сразу.

читаемка....
PM WWW   Вверх
borisbn
Дата 14.6.2011, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(baldina @  14.6.2011,  16:14 Найти цитируемый пост)
Вы путаете логическое программирование и функциональное.

да, скорее всего путаю, но, насколько я помню, в прологе машина вывода как раз и работала через рекурсию.

А вообще - оооочень содержательный ответ. Спасибо.

Добавлено через 1 минуту и 57 секунд
Цитата(baldina @  14.6.2011,  16:14 Найти цитируемый пост)
карринг, ленивые вычисления, оптимизация хвостовой рекурсии, сопоставление с образцом (сигнатурой)

baldina, не могли бы Вы дать ссылку, где почитать про эти термины ?



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
sergioK1
Дата 14.6.2011, 18:17 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 417
Регистрация: 30.1.2011

Репутация: нет
Всего: нет



Цитата(boostcoder @ 14.6.2011,  14:48)
Цитата(sergioK1 @  14.6.2011,  15:20 Найти цитируемый пост)
подобные вопросы обычно возникают у тех кто не умеет писать  хороший код ,  и думают что если ООП то багов нету

у меня к тебе был всего один вопрос: гадков-то тебе сколько?

А такие задают когда аргументов вообще  нет ,  
PM MAIL   Вверх
Sahab
Дата 15.6.2011, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 151
Регистрация: 1.9.2009

Репутация: нет
Всего: 3



интересно, а какие аргументы могут быть на этот бред?)
Цитата

подобные вопросы обычно возникают у тех кто не умеет писать  хороший код ,  и думают что если ООП то багов нету

PM MAIL   Вверх
boostcoder
Дата 15.6.2011, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(Sahab @  15.6.2011,  11:04 Найти цитируемый пост)
а какие аргументы могут быть на этот бред?

Вы тоже считаете что природа ошиблась?


Это сообщение отредактировал(а) boostcoder - 15.6.2011, 11:10
PM WWW   Вверх
baldina
Дата 15.6.2011, 13:30 (ссылка) |    (голосов:5) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Цитата(borisbn @  14.6.2011,  16:25 Найти цитируемый пост)
Цитата(baldina @  14.6.2011,  16:14 )
карринг, ленивые вычисления, оптимизация хвостовой рекурсии, сопоставление с образцом (сигнатурой)

baldina, не могли бы Вы дать ссылку, где почитать про эти термины ?

кратко - в википедии. более полно - погуглить. совсем полно - есть масса литературы про ФП (в магазине).

Совсем кратко (неформально, часть примеров не мои):
карринг - создание функции из другой функции путем подстановки части параметров. Очень близко к понятию замыкания.
в С++ (STL) это делается функциями bind...():

Код

int numbers[] = {10,20,30,40,50,10};
int cx = count_if (numbers, numbers+6, bind1st(equal_to<int>(),10) );
cout << "There are " << cx << " elements that are equal to 10.\n";

здесь из функции двух аргументов equal_to() создается (неименованная) функция одного аргумента, сравнивающая аргумент с 10

ленивые(lazy) вычисления - суть вычисления, отложенные до использования
в С++ есть пример ленивых вычислений: в конструкциях сравнения типа if (x != 0 && y/x < 0) вторая часть (y/x<0) выполняется только в случае, если x!=0. Напротив, вычисление аргументов функции в С++ не ленивые, они всегда вычисляются:
Код

bool foo (int x, int z)
{
   return x != 0 && z < 0;
}

foo (x, y/x); // возможно деление на 0

Поддержка ленивых вычислений в языке позволяет, например, реализовывать бесконечные последовательности данных. в С++ этого нет.
пример - последовательность натуральных чисел на псевдоязыке:
nat := 1 cons head(nat) + tail(nat)
здесь nat - (бесконечный) список, 1 - первый элемент, head - операция получения первого элемента списка, tail - получение списка без первого элемента, cons - операция объединения первого элемента в список, т.е. list := head cons tail

оптимизация хвостовой рекурсии - преобразование рекурсии в цикл, т.е. устранение использования стека. возможно, если рекурсия хвостовая, т.е. рекурсивный вызов не использует состояния.
не хвостовая рекурсия, нельзя оптимизировать:
Код

int factorial(int n)
{
    if (n == 0)
        return 1;
    else
        return n * factorial(n - 1);
}

хвостовая рекурсия, можно оптимизировать:
Код

int fac_times(int n, int acc)
{
    if (n == 0)
        return acc;
    else
        return fac_times(n - 1, acc * n);
}
 
int factorial(int n)
{
    return fac_times(n, 1);
}

последний пример можно превратить в 
Код

int factorial(int n)
{
    int acc = 1;
    while (n!=0)
    {
       acc *= n;
       --n;
    }
    return acc;
}


сопоставление с образцом (pattern matching) - поиск в структурах данных заданных конфигураций.
В ФП это обычно (динамическое) распознавание определенного вида функции. В С++ некоторый аналог этого присутствует на стадии компиляции, т.е. статически определяется функция для вызова: перегрузка функций и сопоставление с шаблоном (template).
В рамках С++ трудно привести хороший пример, но если язык поддерживает ООП и ФП, то сопоставление с образцом может, например, позволить определить на стадии выполнения, при помощи какого конструктора создавался объект.
Отчасти это реализуется наследованием и полиморфизмом, но при полноценно сопоставлении с образцом можно еще проверить и вид параметров. Аналогия - процедура сопоставления фактов в логическом программировании, причем некоторые переменные, входящие в терм, могут быть свободными.

но лучше не меня, а книжки читать))

Добавлено через 3 минуты и 45 секунд
насчет сопоставления с образцом еще мысль появилась: если бы оно было в С++, то были бы возможны мультиметоды (что, кстати, есть или легко моделируется в некоторых Ф-языках).

Добавлено через 14 минут и 11 секунд
Цитата(borisbn @  14.6.2011,  16:25 Найти цитируемый пост)
в прологе машина вывода как раз и работала через рекурсию

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

PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1580 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.