На каких языках реализованы функции функционального программирования?
Lisp разработал набор интересных языковых функций довольно рано в академическом мире, но большинство из них никогда не завоевывали популярность в производственной среде.
Некоторые языки, такие как JavaScript, адаптировали только базовые функции, такие как сборка мусора и лексические замыкания, но все вещи, которые могут реально изменить способ написания программ в больших масштабах, такие как мощные макросы, код с данными и пользовательские структуры управления, только кажется, распространяется в других функциональных языках, ни один из которых не является практичным для использования в нетривиальных проектах.
Сообщество функционального программирования также выдвинуло много других интересных идей (помимо самого функционального программирования), таких как ссылочная прозрачность, обобщенные выражения падежа (т. Е. Сопоставление с образцом, а не искажение, как переключатели C/C#) и функции карри, которые кажутся очевидными полезными в обычном программировании и должны легко интегрироваться с существующей практикой программирования, но по некоторым причинам кажутся застрявшими в академическом мире навсегда.
Почему этим функциям так сложно адаптироваться? Существуют ли какие-либо современные, практичные языки, которые на самом деле учатся на Лиспе вместо того, чтобы наполовину копировать "функции первого класса", или существует внутренний конфликт, который делает это невозможным?
16 ответов
Существуют ли какие-либо современные, практичные языки, которые на самом деле учатся на Лиспе вместо того, чтобы наполовину копировать "функции первого класса", или существует внутренний конфликт, который делает это невозможным?
Почему Lisp, Haskell, Ocaml или F# не современны?
Возможно, вам просто нужно взять это на себя, посмотреть на них и понять, что они более надежны, с такими библиотеками, как java, тогда вы подумаете.
Многие функции были перенесены с функциональных языков на другие языки. Но наоборот - (у некоторых) функциональных языков есть объекты, например.
Я предлагаю вам попробовать Clojure. Синтаксически красивый диалект, функциональный (в смысле ML) и быстрый. Вы получаете неизменяемость, программную транзакционную память, управление многовариантным параллелизмом, поддержку REPL, SLIME и неисчерпаемый FFI. Это Lisp (и Haskell) для бизнес-программиста. Я прекрасно провожу время, используя его каждый день на своей настоящей работе.
Scala - это классный функциональный /OO-язык с сопоставлением с образцом, функциями первого класса и тому подобным. Он имеет преимущество компиляции в байт-код Java и хорошо взаимодействует с кодом Java.
Не существует известной корреляции между языком, "завоевывающим популярность", и наличием у него мощных, хорошо изученных, хорошо разработанных функций.
Много было сказано по этому вопросу. Он существует повсеместно в технологии, а также в искусстве. Мы знаем, что художник А имеет большую подготовку и производит произведения большей широты и глубины, чем художник Б, однако художник Б гораздо более успешен на рынке. Это потому, что есть дух времени? Это потому, что у художника Б лучше маркетинг? Это потому, что большинство людей не поймут время, чтобы понять художника А? Может быть, художник Б тайно ужасен, и мы должны не доверять экспертам, которые выносят суждения о художниках? Наверное, все вышеперечисленное в той или иной степени.
Это сводит с ума людей, которые изучают искусство, и людей, которые изучают языки программирования.
Обычный Лисп, используемый в реальном мире, хотя и не очень, так что, я думаю.
Erlang недавно получил новую известность не только благодаря использованию Twitter, но и благодаря появлению сообщений и реализаций, основанных на XMPP, таких как ejabberd. В нем воплощены многие идеи, вытекающие из функционального программирования, являющегося языком, разработанным с учетом этого. Изначально использовался для запуска телефонных коммутаторов и был разработан Эриксоном для запуска первых сетей GSM. Он все еще существует, он полностью функционален (как язык) и используется во многих производственных средах.
Scala является абсолютным королем языков, которые приняли значительные академические черты. Высшие виды, типы самости, сопоставление полиморфных паттернов и т. Д. Все они являются передовыми (или близкими к ним) темами научных исследований, которые были включены в Scala в качестве фундаментальных особенностей. Возможно, это было в ущерб простоте языка, но это приводит к некоторым очень интересным образцам.
C# является более распространенным явлением, чем Scala, но в нем также реализовано меньше таких функциональных возможностей. LINQ - это ограниченная реализация обобщенных списков Wadler, и все знают о лямбдах. Но при этом C# (по праву) остается немного консервативным в освоении исследовательских функций из академического мира.
Lua.
Он используется в качестве языка сценариев / расширений для ряда игр (например, World of Worcraft) и приложений (Snort, NMAP, Wireshark и т. Д.). На самом деле, по словам разработчика Adobe, Lightroom от Adobe составляет более 40% Lua.
Ребята из Lua неоднократно указывали Scheme и Lisp как основные факторы, влияющие на Lua, а Lua даже описывался как Scheme без скобок.
Много динамических языков программирования реализуют идеи из функционального программирования. Более новые языки.Net (C# и VB) имеют то, что они называют лямбда, но они не свободны от побочных эффектов.
Например, объединить понятия функционального программирования и объектно-ориентированного программирования несложно, но это не всегда имеет смысл. Объектно-ориентированные языки (попробуйте) инкапсулируют состояние внутри объектов, в то время как функциональные языки инкапсулируют состояние внутри функций. Если вы объединяете объекты и функции на одном языке, становится все сложнее понять все это.
Было много языков, которые объединили эти парадигмы, просто сложив их вместе (F#), и это может быть полезно, но я думаю, что нам все еще нужно несколько десятилетий игры с такими языками, пока мы не сможем создать новую парадигму, которая успешно объединит идеи из oo и функционального программирования.
Lisp разработал набор интересных языковых функций довольно рано в академическом мире, но большинство из них никогда не завоевывали популярность в производственной среде.
Потому что люди, которые управляют разработчиками программного обеспечения, - это не те люди, с которыми вы можете вести интересный чат, сравнивая различные языковые функции. Приблизительно в 2000 году я хотел использовать LISP для реализации преобразований XML-в-HTML на нашем корпоративном веб-сайте (это примерно в то время, когда Amazon внедряет свой бэкэнд в LISP). Я не дошел до. Это немного иронично, потому что компания, в которой я работал, создала и продала среду Common LISP.
C# 3.0 определенно делает.
C# теперь имеет
- Лямбда-выражения
- Функции высшего порядка
- Map / Reduce + Filter ( Folding?) Для списков и всех типов, которые реализуют IEnumerable.
- LINQ
- Объект + коллекция инициализаторов.
Последние два элемента списка могут не подпадать под надлежащее функциональное программирование, в любом случае ответ на C# реализовал много полезных концепций из Lisp и т. Д.
В дополнение к тому, что было сказано, большая часть LISP основана на гарантированном отсутствии побочных эффектов и использовании встроенных структур данных. Оба редко держатся в реальном мире. ML, вероятно, лучше функциональной базы.
Еще один "реальный" язык, который реализует функциональные возможности программирования, - это Javascript. Поскольку абсолютно все имеет значение, функции высокого порядка легко реализуются. У вас также есть другие клиенты функционального программирования, такие как лямбда-функции, замыкания и каррирование.
Функции, на которые вы ссылаетесь ("мощные" макросы, элемент кода в виде данных и пользовательские структуры управления), не распространялись в других функциональных языках. Они умерли после того, как Лисп научил нас, что они плохая идея.
Современные функциональные языки (OCaml, Haskell, Erlang, Scala, F#, C# 3.0, JavaScript) не имеют этих функций.
Приветствия, Джон Харроп.