На каких языках реализованы функции функционального программирования? - PullRequest
1 голос
/ 16 сентября 2008

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

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

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

Почему этим функциям так сложно адаптироваться? Существуют ли какие-либо современные, практичные языки, которые на самом деле учатся на Лиспе вместо того, чтобы наполовину копировать «функции первого класса», или существует внутренний конфликт, который делает это невозможным?

Ответы [ 16 ]

2 голосов
/ 17 сентября 2008

В дополнение к тому, что было сказано, большая часть LISP основана на гарантированном отсутствии побочных эффектов и использовании встроенных структур данных. Оба редко держатся в реальном мире. ML, вероятно, является лучшей функциональной базой.

2 голосов
/ 16 сентября 2008

C # 3.0 определенно делает.

C # теперь имеет

  1. Лямбда-выражения
  2. Функции высшего порядка
  3. Map / Reduce + Filter (Folding?) Для списков и всех типов, которые реализуют IEnumerable.
  4. 1012 * LINQ *
  5. Объект + Инициализаторы Коллекции.

Последние два элемента списка могут не подпадать под надлежащее функциональное программирование, в любом случае ответ на C # реализовал много полезных концепций из Lisp и т. Д.

2 голосов
/ 16 сентября 2008

Многие языки динамического программирования реализуют идеи функционального программирования. Более новые языки .Net (C # и VB) имеют то, что они называют лямбда, но они не свободны от побочных эффектов.

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

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

2 голосов
/ 16 сентября 2008

Вы уже проверили F #

1 голос
/ 09 октября 2008

Другим языком "реального мира", который реализует функциональные возможности программирования, является Javascript. Поскольку абсолютно все имеет значение, функции высокого порядка легко реализуются. У вас также есть другие клиенты функционального программирования, такие как лямбда-функции, замыкания и карри.

0 голосов
/ 19 октября 2008

Функции, на которые вы ссылаетесь («мощные» макросы, элемент кода в виде данных и пользовательские структуры управления), не распространяются на другие функциональные языки. Они умерли после того, как Лисп научил нас, что это плохая идея.

Современные функциональные языки (OCaml, Haskell, Erlang, Scala, F #, C # 3.0, JavaScript) не имеют этих функций.

Ура, Джон Харроп.

...