Почему функциональные языки?

Я вижу здесь много разговоров о функциональных языках и т.д. Почему вы использовали бы его над "традиционным" языком? Что они делают лучше? Чем они хуже? Какое идеальное приложение для функционального программирования?

Ответ 1

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

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

Традиционно, одним из больших недостатков функционального программирования было также отсутствие побочных эффектов. Очень сложно написать полезное программное обеспечение без IO, но IO трудно реализовать без побочных эффектов в функциях. Таким образом, большинство людей никогда не извлекало больше пользы из функционального программирования, чем вычисление одного выхода из одного входа. В современных языках со смешанной парадигмой, таких как F # или Scala, это проще.

Многие современные языки имеют элементы из функциональных языков программирования. С# 3.0 имеет много функциональных функций программирования, и вы можете заниматься функциональным программированием и на Python. Я думаю, что причины популярности функционального программирования в основном объясняются двумя причинами: параллелизм становится реальной проблемой в нормальном программировании, потому что мы получаем все больше и больше многопроцессорных компьютеров; и языки становятся все более доступными.

Ответ 2

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

Однако языки, которые применяют функциональный стиль, в наши дни получают множество виртуальных чернил, и будут ли эти языки доминировать в будущем, это открытый вопрос. Мое собственное подозрение состоит в том, что гибридные языки с несколькими парадигмами, такие как Scala или OCaml вероятно, будут доминировать над "пуристскими" функциональными языками так же, как чистый язык OO (Smalltalk, Beta и т.д.) повлияли на основное программирование, но не оказались в качестве наиболее широко используемых обозначений.

Наконец, я не могу усомниться в том, что ваши комментарии re FP сильно параллельны замечаниям, которые я слышал от процедурных программистов не так много лет назад:

  • "Мифический, ИМХО" "средний" программист этого не понимает.
  • Он не получил широкого распространения.
  • Любая программа, с которой вы можете писать, может быть написана другим способом с помощью современных методов.

Так же, как графические пользовательские интерфейсы и "код как модель бизнеса" были концепциями, которые помогли OO получить более высокую оценку, я считаю, что более широкое использование неизменности и простота (массивная) parallelism поможет большему количеству программистов увидеть преимущества что предлагает функциональный подход. Но насколько мы узнали в последние 50 или около того лет, которые составляют всю историю цифрового компьютерного программирования, я думаю, что мы все еще имеем много учиться. Спустя двадцать лет программисты с изумлением взглянут на примитивный характер инструментов, которые мы сейчас используем, в том числе теперь популярные языки OO и FP.

Ответ 3

Основным плюсом для меня является его неотъемлемый parallelism, тем более что мы сейчас уходим с большей частоты МГц и на все больше и больше ядер.

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

Ответ 4

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

Я говорю, что нет причин не изучать его.

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

Ответ 5

Я всегда скептически отношусь к следующей большой вещи. Много раз "Следующая большая вещь" является чистой случайностью истории, находящейся в правильном месте в нужное время независимо от того, хорошая технология или нет. Примеры: С++, Tcl/Tk, Perl. Все испорченные технологии, все безумно успешные, потому что они воспринимались либо для решения проблем дня, либо для того, чтобы быть почти идентичными укоренившимся стандартам, или и то, и другое. Функциональное программирование действительно может быть большим, но это не значит, что он будет принят.

Но я могу сказать вам, почему люди в восторге от функционального программирования: многие, многие программисты имеют своего рода "опыт конверсии", в котором они обнаруживают, что использование функционального языка делает их в два раза более производительными (или, может быть, в десять раз эффективными ) при создании кода, который более устойчив к изменениям и имеет меньше ошибок. Эти люди думают о функциональном программировании как о секретном оружии; хорошим примером этого мышления является Пол Грэм Избиение средних значений. О, и его выражение? Веб-приложения для электронной коммерции.

С начала 2006 года также появилось некоторое ожидание функционального программирования и parallelism. Поскольку такие люди, как Саймон Пейтон Джонс, беспокоились о parallelism с по крайней мере с 1984 года, я не задерживаю дыхание, пока функциональные языки решить многоядерную проблему. Но сейчас это объясняет некоторые дополнительные шумы.

В целом, американские университеты плохо выполняют работу по функциональному программированию. Там есть сильное ядро ​​поддержки обучения интро программирования с использованием схемы, и Haskell также пользуется некоторой поддержкой там, но очень мало на пути обучения продвинутым техника для функционального программиста. Я преподавал такой курс в Гарварде и снова сделаю это в spring в Туфтах. Бенджамин Пирс преподавал такой курс в Пенне. Я не знаю, сделал ли Павел Худак что-нибудь в Йеле. Европейские университеты делают гораздо лучшую работу; например, функциональное программирование подчеркивается в важных местах в Дании, Нидерландах, Швеции и Великобритании. У меня меньше ощущается то, что происходит в Австралии.

Ответ 6

Я не вижу никого, кто упоминает слона в комнате здесь, поэтому я думаю, что это зависит от меня:)

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

В сочетании с закрытием FP делает JS-код действительно легким, но все еще читаемым.

Cheers, PS

Ответ 7

Большинство приложений достаточно просты, чтобы их можно было разрешить обычными способами OO

  • Пути OO не всегда были "нормальными". Этот десятилетний стандарт был последней декаде маргинализированной концепцией.

  • Функциональное программирование - математика. Пол Грэм на Lisp (замените функциональное программирование на Lisp):

Итак, короткое объяснение того, почему 1950-х годов язык не устарел, так это то, что это была не технология, а математика, и математика не устаревает. Право вещь для сравнения Lisp to is not 1950s аппаратное обеспечение, но, скажем, Quicksort алгоритм, который был обнаружен в 1960 год и по-прежнему является самым быстрым общего назначения.

Ответ 8

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

  • Формулы Excel
  • Кварцевый Композитор
  • JavaScript
  • Логотип (черепаха графика)
  • LINQ
  • SQL
  • Underscore.js (или Lodash), D3

Ответ 9

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

Это только вопрос времени. Ваш средний корпоративный программист узнает, какова бы ни была текущая Большая Вещь. 15 лет назад они не понимали ООП. IF FP поймает, ваши "средние корпоративные программисты" последуют.

В университетах он действительно не учился (или это сейчас?)

Зависит много. В моем университете SML - это самый первый язык, в который учатся студенты. Я считаю, что MIT преподает LISP как курс первого курса. Разумеется, эти два примера не могут быть репрезентативными, но я считаю, что большинство университетов по крайней мере предлагают некоторые дополнительные курсы по FP, даже если они не делают его обязательной частью учебной программы.

Большинство приложений достаточно просты для решаться обычными способами OO

На самом деле это не вопрос "достаточно простой". Будет ли решение проще (или более читабельным, надежным, элегантным, совершенным) в FP? Многие вещи "достаточно просты, чтобы их можно было решить на Java", но для этого все еще требуется коварное количество кода.

В любом случае, имейте в виду, что сторонники FP заявили, что это была следующая Большая Вещь в течение нескольких десятилетий. Возможно, они правы, но имейте в виду, что они не были, когда они делали то же требование 5, 10 или 15 лет назад.

Одна вещь, которая определенно учитывает в их пользу, однако, заключается в том, что в последнее время С# резко повернулся к FP, настолько, что практически превратил поколение программистов в программистов FP, даже не заметив их. Это может просто проложить путь к революции "FP". Может быть.;)

Ответ 10

Человек не может понять совершенства и несовершенства своего избранного искусства, если он не может видеть ценность в других искусствах. Следующие правила разрешают разработку до определенного момента техники, а затем ученику и художнику приходится больше учиться и искать дальше. Имеет смысл изучать другие виды искусства, а также стратегии.

Кто не узнал больше о себе, наблюдая за деятельностью других? Чтобы изучить меч, изучите гитару. Изучить коммерческую коммерческую деятельность. Просто изучить меч сделает вас ограниченным и не позволит вам расти наружу.

- Миямото Мусаси, "Книга из пяти колец"

Ответ 11

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

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

Вместо этого Haskell использует другой подход к IO: monads. Это объекты, которые содержат требуемую операцию ввода-вывода, которую должен выполнить ваш интерпретатор. На любом другом уровне это просто объекты в системе.

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

Ответ 12

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

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

Это делает вас лучше разумным существом.

Ответ 13

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

Ответ 14

Я бы отметил, что все, что вы говорили о функциональных языках, большинство людей говорили об объектно-ориентированных языках около 20 лет назад. Тогда было очень часто слышать об OO:

* The average corporate programmer, e.g. most of the people I work with, will not understand it and most work environments will not let you program in it
* It not really taught at universities (or is it nowadays?)
* Most applications are simple enough to be solved in normal IMPERATIVE ways

Изменение должно произойти откуда-то. Значительное и важное изменение произойдет независимо от того, будут ли люди, обучающиеся в более ранних технологиях, придерживаться мнения о том, что изменение не требуется. Считаете ли вы, что изменение в OO было хорошим, несмотря на все люди, которые были против этого в то время?

Ответ 15

F # может ухватиться, потому что Microsoft нажимает на него.

Pro:

  • F # будет частью следующей версии Visual Studio
  • Корпорация Microsoft создает сообщество в течение некоторого времени - евангелисты, книги, консультанты, которые работают с клиентами высокого профиля, значительную экспозицию на конференциях MS.
  • F # - это первый класс .Net-язык, и это первый функциональный язык, который поставляется с действительно большим фундаментом (не то, что я говорю, что Lisp, Haskell, Erlang, Scala, OCaml не имеют большого количества библиотек, они просто не так полно, как .Net)
  • Сильная поддержка parallelism

Contra:

  • F # очень сложно запустить, даже если вы хороши с С# и .Net - по крайней мере для меня: (
  • вероятно, будет сложно найти хороших разработчиков F #.

Итак, я даю шанс 50:50 F # стать важным. Другие функциональные языки не собираются делать это в ближайшем будущем.

Ответ 16

Я думаю, что одна из причин заключается в том, что некоторые люди считают, что самая важная часть того, будет ли язык принят, - это насколько хороший язык. К сожалению, все так редко бывает так просто. Например, я бы сказал, что самый большой фактор, лежащий в основе принятия Python, - это не сам язык (хотя это очень важно). Самая большая причина, почему Python настолько популярен, - это огромная стандартная библиотека и еще большее сообщество сторонних библиотек.

Такие языки, как Clojure или F #, могут быть исключением из правила, учитывая, что они построены на JVM/CLR. В результате у меня нет ответа на них.

Ответ 17

Большинство приложений можно решить в [вставьте свой любимый язык, парадигму и т.д. здесь].

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

Ответ 18

Мне кажется, что те люди, которые никогда не изучали Lisp или Scheme в качестве бакалавра, теперь открывают его. Как и во многих вещах в этой области, существует склонность к шумихе и созданию высоких ожиданий...

Он пройдет.

Функциональное программирование велико. Тем не менее, это не займет всего мира. C, С++, Java, С# и т.д. Все еще будут.

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

Ответ 19

Когда я читал "Следующий основной язык программирования: перспектива разработчиков игр" Тима Суини, Epic Games, моя первая мысль была - мне нужно научиться Haskell.

PPT

HTML-версия Google

Ответ 21

Вещи двигались в функциональном направлении некоторое время. Два классных новых ребят прошлых нескольких лет, Ruby и Python, как радикально ближе к функциональным языкам, чем того, что было перед ними, настолько, что некоторые лисперы начали поддерживать одно или другое как "достаточно близко".

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

Ответ 22

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

  • Закрытие, анонимные функции, передача и возврат функций в качестве значений, используемых как экзотические функции, известные только Lisp и ML хакерам. Но постепенно С#, Delphi, Python, Perl, Javascript добавили поддержку закрытий. Невозможно, чтобы любой восходящий язык воспринимался серьезно без закрытия.

  • Несколько языков, в частности Python, С# и Ruby, имеют встроенную поддержку списков и генераторов списков.

  • ML впервые разработал универсальное программирование в 1973 году, но поддержка дженериков ( "параметрический полиморфизм" ) стала лишь отраслевым стандартом за последние 5 лет или около того. Если я правильно помню, Fortran поддерживал генерики в 2003 году, за которым следуют Java 2004, С# в 2005 году, Delphi в 2008 году. (Я знаю, что С++ поддерживает шаблоны с 1979 года, но 90% обсуждений на С++ STL начинаются с "здесь есть демоны",.)

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

Большинство приложений достаточно просты для решаться обычными способами OO

Кто сказал, что нельзя использовать функциональное программирование для простых вещей? Не каждая функциональная программа должна быть компилятором, теоретиком или массовым параллельным коммутатором. Я регулярно использую F # для специальных сценариев throwaway в дополнение к моим более сложным проектам.

Ответ 23

Это ловить, потому что это лучший инструмент для управления сложностью. См:
- слайды 109-116 из Саймона Пейтона-Джонса говорят "Вкус Хаскелла"
- "Следующий основной язык программирования: перспектива разработчика игр" Тима Суини

Ответ 24

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

В конце 90-х они учили Хаскелла и М.Л. в Стэнфорде. Я уверен, что такие места, как Carnegie Mellon, MIT, Stanford и другие хорошие школы, представляют его студентам.

Я согласен с тем, что большинство "выставляют реляционные базы данных в Интернете" приложения будут продолжаться в этом ключе в течение длительного времени. Java EE,.NET, RoR и PHP разработали довольно неплохие решения этой проблемы.

Вы попали на что-то важное: может быть, проблема не может быть легко решена другими способами, которые будут способствовать функциональному программированию. Что это будет?

Будут ли массивные многоядерные аппаратные и облачные вычисления продвигать их?

Ответ 25

Поскольку FP имеет значительные преимущества с точки зрения производительности, надежности и ремонтопригодности. Многоядерное устройство может быть убийственным приложением, которое, наконец, получает большие корпорации, чтобы переключиться, несмотря на большие объемы устаревшего кода. Кроме того, даже большие коммерческие языки, такие как С#, приобретают отличный функциональный вкус в результате многоядерных проблем - побочные эффекты просто не подходят с concurrency и parallelism.

Я не согласен с тем, что "нормальные" программисты этого не поймут. Они будут, точно так же, как они в конце концов поняли ООП (что так же загадочно и странно, если не больше).

Кроме того, большинство университетов учат FP, многие даже учат его в качестве первого курса программирования.

Ответ 26

Вау - это интересная дискуссия. Мои собственные мысли по этому поводу:

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

Ответ 27

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

Безгражданный характер FP более естественным образом сопоставляется с апатрийной природой Интернета, и, следовательно, функциональные языки легче приспосабливаются к более элегантным, RESTFUL webapps. Контраст с форматами JAVA и .NET, которые должны прибегать к ужасно уродливым HACKS, таким как ключи VIEWSTATE и SESSION, для поддержания состояния приложения и поддержания (иногда довольно непроницаемой) абстракции языка с обязательным условием, на функциональной платформе, не имеющей аналогов, как и в Интернете.

А также, чем больше без апатридов ваше приложение, тем легче он может поддаваться параллельной обработке. Ужасно важно для Интернета, если ваш сайт становится популярным. Не всегда просто просто добавить больше оборудования на сайт для повышения производительности.

Ответ 28

Мое мнение состоит в том, что теперь Microsoft поймает его гораздо дальше в основное русло. Для меня это привлекательно из-за того, что он может сделать для нас, потому что это новая задача и из-за возможностей работы, которые она испытывает в будущем.

После освоения это станет еще одним инструментом, помогающим нам сделать нас более продуктивными как программисты.

Ответ 29

Точка, пропущенная в обсуждении, заключается в том, что лучшие системы типов найдены на современных языках FP. Что еще, компиляторы могут автоматически вывести все (или, по крайней мере, большинство) типов.

Интересно, что при программировании Java тратит половину времени на написание имен типов, но Java на сегодняшний день не безопасен для типов. Хотя вы никогда не можете писать типы в программе Haskell (кроме как в виде документации, проверенной компилятором), и код безопасен на 100%.

Ответ 30

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

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