![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
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 |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |