Какие функциональные языковые приемы можно использовать в императивных языках? - PullRequest
7 голосов
/ 25 февраля 2009

Какие методы или парадигмы, обычно ассоциируемые с функциональными языками, могут продуктивно использоваться и в императивных языках?

например:.

  • Рекурсия может быть проблематичной в языках без оптимизации хвостового вызова, ограничивая ее использование узким набором случаев, поэтому она имеет ограниченную полезность
  • Карта и фильтр нашли свое применение в нефункциональных языках, даже при том, что они имеют функциональный вид

Мне действительно нравится не беспокоиться о состоянии в функциональных языках. Если бы я был особенно упрям, я мог бы писать программы на C без изменения переменных, только заключая в капсулу мое состояние в переменных, передаваемых в функции, и в значениях, возвращаемых из функций.

Несмотря на то, что функции не являются значениями первого класса, я могу заключить их в объект в Java, скажем, и передать их в другой метод. Как и функциональное программирование, просто веселее.

Итак, для ветеранов функционального программирования, когда вы программируете на императивных языках, какие идеи из FP вы успешно применили?

Ответы [ 5 ]

11 голосов
/ 25 февраля 2009

Почти все из них?

Если вы понимаете функциональные языки, вы можете написать императивные программы, которые «информированы» функциональным стилем. Это уведет вас от побочных эффектов и к программам, в которых чтение текста программы в любой конкретный момент достаточно, чтобы вы действительно знали, что означает программа в этот момент.

Еще на заре Времени мы привыкли беспокоиться о «сцеплении» и «сплоченности». Изучение FP приведет вас к написанию систем с оптимальной (минимальной) связью и высокой когезией.

6 голосов
/ 25 февраля 2009

Вот некоторые вещи, которые мешают выполнять FP на не-FP языке:

  • Если язык не поддерживает лямбда / замыкания и не имеет никакого синтаксического сахара, чтобы легко его взломать, вы мертвы в воде. Вы не называете карту / фильтр без замыканий.
  • Если язык статически типизирован и не поддерживает генерики , вы мертвы в воде. Все хорошие вещи FP используют универсальность.
  • Если язык не поддерживает хвостовую рекурсию , вам мешают. Вы можете написать реализации, например, 'карта' итеративно; также часто ваши данные могут быть не слишком большими, и рекурсия будет в порядке.
  • Если язык не поддерживает алгебраических типов данных и сопоставление с шаблоном , вы будете слегка затруднены. Просто раздражает не иметь их, как только ты попробуешь их.
  • Если язык не может выразить классы типа , ну да ладно ... вы обойдетесь, но, черт возьми, если это не просто потрясающая функция, но Haskell - единственный удаленно популярный язык с хорошая поддержка.
3 голосов
/ 26 февраля 2009

Я успешно использовал функции высшего порядка, особенно те, которые передаются, а не те, которые возвращаются. Возвращаемый тип может быть немного утомительным, но его можно смоделировать.

Все виды аппликативных структур данных и рекурсивных функций хорошо работают в императивных языках.

Вещи, которые я скучаю больше всего:

  • Почти ни один императивный язык не гарантирует оптимизацию каждого хвостового вызова.

  • Я не знаю ни одного императивного языка, который бы поддерживал анализ случаев путем сопоставления с образцом.

3 голосов
/ 25 февраля 2009

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

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

0 голосов
/ 17 января 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...