![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
всем доброго дня.
прочел доку по Phoenix, поразбирал примеры, кое-что накодил... в общем все понятно. не понятно другое: как/где/зачем/почему реально применять функциональное программирование в с++ ? в добавок прочел вики: Функциональное программирование, но ничего не прояснилось. кто в теме, расскажите, в чем соль? спасибо. |
|||
|
||||
maint |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 77 Регистрация: 12.5.2008 Репутация: нет Всего: 2 |
если судить по книге Д.Роджерс "Алгоритмические основы машинной графики" математики там как грязи. А графика, сечас, в основном на плюсах рисуется. Это на вскидку, что пришло в голову.
|
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
maint, спасибо.
но это не объяснение и не обоснование. Добавлено через 32 секунды наверное нужно во флейме создать тему... |
|||
|
||||
afiskon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 31.3.2011 Где: Россия, Москва Репутация: 1 Всего: 4 |
Как я рад, что вы спросили
![]() Это сообщение отредактировал(а) afiskon - 12.6.2011, 17:13 |
|||
|
||||
boostcoder |
|
||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
вот, это аргумент!
после тире, что-то не так со смыслом.. |
||||
|
|||||
afiskon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 294 Регистрация: 31.3.2011 Где: Россия, Москва Репутация: 1 Всего: 4 |
"в ФП его нет ни в каком виде" - исправил )
|
|||
|
||||
Фантом |
|
|||
![]() Вы это прекратите! ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: нет Всего: 49 |
Вообще-то это два разных вопроса: нужно ли функциональное программирование вообще и нужно ли оно в C++. С первым вопросом все и так понятно, а вот второй куда сложнее.
|
|||
|
||||
Sartorius |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1568 Регистрация: 18.7.2006 Где: Ivory tower Репутация: 8 Всего: 37 |
||||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
Фантом, в топике конкретный вопрос:
про функциональное программирование вообще, я ничего не могу сказать. да и не интересно как-то... |
|||
|
||||
Фантом |
|
|||
![]() Вы это прекратите! ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1516 Регистрация: 23.3.2008 Репутация: нет Всего: 49 |
||||
|
||||
kemiisto |
|
||||||
![]() Дикий Кот. =^.^= ![]() ![]() ![]() ![]() Награды: 1 Профиль Группа: Участник Клуба Сообщений: 3292 Регистрация: 29.7.2007 Репутация: 2 Всего: 160 |
Человек вчера Haskell увидел. Эко... Увидел эту грязную инсинуацию в бложике такого же как он однодневного функционального программиста. Звучит-то как красиво! Перетащил. ![]() Каждый из которых не годится даже для холиваров. Слишком толсто.
Эм... Я даже как-то растерян.
Аргумент! ![]()
Мне всё понятно со всеми тремя вопросами. ![]() -------------------- |
||||||
|
|||||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 37 Всего: 85 |
||||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Небольшой
![]() как-то давно (ещё в институте) изучали prolog. Мне понравилось, как там решалась задача с перевозкой козы, капусты и волка через речку: описание алгоритма отсутствовало, описывались лишь правила: этот не может быть с этим, а этот с этим. И указывалось, что лодочник может взять лишь один "предмет". Всё. Дальше говорилось что-то типа "Старт" и программа сама находила алгоритм перевозки. Потом я понял, что ФП не для джедаев/программистов, т.к. у них в голове одни алгоритмы. Это, скорее, для чистых математиков/физиков/химиков (kemiisto - hi ![]() -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
sergioK1 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 417 Регистрация: 30.1.2011 Репутация: нет Всего: нет |
Я лично не понимаю вопроса, ФП нужно там где задача не требует обьектов, т,е, из не надо изобретать
потому что это модно, с другой стороны static чем не фп , подобные вопросы обычно возникают у тех кто не умеет писать хороший код , и думают что если ООП то багов нету Это сообщение отредактировал(а) sergioK1 - 14.6.2011, 18:11 |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
baldina |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
совсем не аргумент. ибо в С++ никакой параллельности нет)))
Вы путаете логическое программирование и функциональное. В Prolog работает машина вывода, в ФП этого нет. В ФП те же самые алгоритмы. Как это реализуется. Функционально можно программировать на любом языке, где есть рекурсия. На языке, где передача аргументов производится по значению, это удобнее. На языке, где можно реализовать функции высших порядков (принимающие функции в качестве аргументов), это удобнее. На языке, где можно создавать неименованные функции в месте вызова (лямбда-функции), это удобнее. Все это можно с успехом делать на С++. Есть еще несколько вещей, которые традиционно присутствуют в Ф-языках и связываются с ФП - карринг, ленивые вычисления, оптимизация хвостовой рекурсии, сопоставление с образцом (сигнатурой). Многое из этого можно с разной степенью удобства моделировать в С++. Зачем все это нужно. Функциональные алгоритмы (рекурсивные) часто проще для понимания и реализации. Ф алгоритмы часто более кратки, чем их императивные аналоги. ФП является более надежным, т.к. работает с константами, а не переменными. Т.е. не нужно искать, где переменная могла быть модифицирована. Как(когда) это применять. ФП - парадигма, поэтому для его использования надо встать на определенную точку зрения. Основой этой точки зрения, на мой взгляд, является вычисление функции (это тривиальное объяснение) и применение функции к данным(аргументам). Функциональный взгляд проявляется в конструкциях типа
- преобразование четных элементов списка в строку, где элементы разделены точкой с запятой. Реальные программы, конечно, не могут быть чисто функциональными, т.к. должны генерировать побочные эффекты в виде ввода/вывода, но основной идее это не мешает. Удобно и продуктивно совмещать различные парадигмы в рамках одного проекта. Почитайте про язык Scala: Java-подобный синтаксис, в целом близкий программистам на С++, объединение парадигм функционального, объектно-ориентированного, аспектно-ориентированного и обобщенного программирования. В статьях и книжке авторов языка приводится масса задач и примеров, из которых видны преимущества такого симбиоза, там же объясняются преимущества функционального подхода. Да они и из кода видны сразу. Это сообщение отредактировал(а) baldina - 14.6.2011, 16:17 |
||||
|
|||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
baldina, спасибо.
читаемка.... |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
да, скорее всего путаю, но, насколько я помню, в прологе машина вывода как раз и работала через рекурсию. А вообще - оооочень содержательный ответ. Спасибо. Добавлено через 1 минуту и 57 секунд
baldina, не могли бы Вы дать ссылку, где почитать про эти термины ? -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
sergioK1 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 417 Регистрация: 30.1.2011 Репутация: нет Всего: нет |
||||
|
||||
Sahab |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 151 Регистрация: 1.9.2009 Репутация: нет Всего: 3 |
интересно, а какие аргументы могут быть на этот бред?)
|
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
Вы тоже считаете что природа ошиблась? Это сообщение отредактировал(а) boostcoder - 15.6.2011, 11:10 |
|||
|
||||
baldina |
|
||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
кратко - в википедии. более полно - погуглить. совсем полно - есть масса литературы про ФП (в магазине). Совсем кратко (неформально, часть примеров не мои): карринг - создание функции из другой функции путем подстановки части параметров. Очень близко к понятию замыкания. в С++ (STL) это делается функциями bind...():
здесь из функции двух аргументов equal_to() создается (неименованная) функция одного аргумента, сравнивающая аргумент с 10 ленивые(lazy) вычисления - суть вычисления, отложенные до использования в С++ есть пример ленивых вычислений: в конструкциях сравнения типа if (x != 0 && y/x < 0) вторая часть (y/x<0) выполняется только в случае, если x!=0. Напротив, вычисление аргументов функции в С++ не ленивые, они всегда вычисляются:
Поддержка ленивых вычислений в языке позволяет, например, реализовывать бесконечные последовательности данных. в С++ этого нет. пример - последовательность натуральных чисел на псевдоязыке: nat := 1 cons head(nat) + tail(nat) здесь nat - (бесконечный) список, 1 - первый элемент, head - операция получения первого элемента списка, tail - получение списка без первого элемента, cons - операция объединения первого элемента в список, т.е. list := head cons tail оптимизация хвостовой рекурсии - преобразование рекурсии в цикл, т.е. устранение использования стека. возможно, если рекурсия хвостовая, т.е. рекурсивный вызов не использует состояния. не хвостовая рекурсия, нельзя оптимизировать:
хвостовая рекурсия, можно оптимизировать:
последний пример можно превратить в
сопоставление с образцом (pattern matching) - поиск в структурах данных заданных конфигураций. В ФП это обычно (динамическое) распознавание определенного вида функции. В С++ некоторый аналог этого присутствует на стадии компиляции, т.е. статически определяется функция для вызова: перегрузка функций и сопоставление с шаблоном (template). В рамках С++ трудно привести хороший пример, но если язык поддерживает ООП и ФП, то сопоставление с образцом может, например, позволить определить на стадии выполнения, при помощи какого конструктора создавался объект. Отчасти это реализуется наследованием и полиморфизмом, но при полноценно сопоставлении с образцом можно еще проверить и вид параметров. Аналогия - процедура сопоставления фактов в логическом программировании, причем некоторые переменные, входящие в терм, могут быть свободными. но лучше не меня, а книжки читать)) Добавлено через 3 минуты и 45 секунд насчет сопоставления с образцом еще мысль появилась: если бы оно было в С++, то были бы возможны мультиметоды (что, кстати, есть или легко моделируется в некоторых Ф-языках). Добавлено через 14 минут и 11 секунд в терминах рекурсии проще объяснить работу машины вывода, но не обязательно она так реализована. главным в работе машины вывода prolog является (последовательное) сопоставление цели с фактами. можно, например, представить, что гипотезы, генерируемые машиной вывода, временно становятся частью фактов, а сопоставление только линейное. |
||||||||||
|
|||||||||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |