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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> функциональное программирование в с++. зачем?! 
V
    Опции темы
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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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