Подтвердить что ты не робот

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

Мне кажется, что из экспериментов с Haskell, Erlang и Scheme, функциональные языки программирования являются фантастическим способом ответа на научные вопросы. Например, взяв небольшой набор данных и проведя некоторый обширный анализ, чтобы вернуть значительный ответ. Это отлично подходит для работы с некоторыми сложными вопросами Project Euler или с попыткой попробовать пробку Google Code оригинальным способом.

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

В основном, задачи, которые я бы назвал "практическими", например

Aceept a request, find and process requested data,
 and return it formatted as needed

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

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

4b9b3361

Ответ 1

Что касается языков, я думаю, что F # является примером языков, которые в основном являются "функциональными", но также "практичными". Scala и Clojure, вероятно, другие в этой категории.

(Идя на один уровень глубже, я думаю, что "формула успеха" здесь - это язык, который сильно склоняется к "функциональному", но имеет доступ к обширным практическим библиотекам (например,.Net/JVM/some C FFI) и имеет хорошие (например, поддержка IDE).

Я, по крайней мере, согласен с неявной предпосылкой вопроса, а именно, что существует напряженность между "лаконичной/красивой аналитической силой" и "прагматикой".

Ответ 2

ИМО, схема слишком минимальна, чтобы быть практичной - она ​​используется на нескольких курсах обучения (см. "Структура и интерпретация компьютерных программ" ). Однако современные языки Lisp, такие как Common Lisp и особенно Clojure, приобретают все большее значение. Erlang используется несколькими крупными отраслями для приложений с высоким concurrency, и я лично не видел, чтобы он использовался программистами конечных пользователей. Haskell, с другой стороны, является вполне реальным языком и используется для написания большого количества замечательного программного обеспечения, включая:

  • XMonad - это оконный менеджер окна X Window, написанный исключительно в Haskell.
  • Leksah, IDE для Haskell, написан в самом Haskell.
  • Pugs, одна из ведущих реализаций Perl 6, написана в Haskell.
  • Наконец, компилятор Glasgow Haskell написан в Haskell.

Ответ 3

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

Наш бизнес работает с кодом F #, для всего, от операций онлайн-транзакций онлайн до веб-аналитики. Эти приложения LOB состоят из крошечных скриптов F #, которые делают все, что требуется быстро и просто, с помощью .NET бесшовного взаимодействия и автоматизации приложений, таких как Outlook и Excel.

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

Ответ 4

Смешно, у нас с вами очень разные понятия о "практических задачах". Вы говорите, что это:

Удовлетворить запрос, найти и обработать запрошенные данные и вернуть их отформатированный по мере необходимости

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

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

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

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

Ответ 5

Erlang хорошо известен своей надежностью и возможностями для написания высококонкурентных серверов.

Он также имеет СУБД вне коробки.

Ответ 7

В основном, задачи, которые я бы назвал "практический", например

Удовлетворить запрос, найти и обработать   запрошенные данные и вернуть их   отформатированный по мере необходимости

Вы экспериментировали с Erlang и не могли найти для него практическую задачу в этом описании практического?

Принять запрос.

Вы имеете в виду как receive. Или просто вызывается как функция.

Найти и обработать запрошенные данные.

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

Для обработки там целая куча вещей для строк, списков, математики, множеств, графиков и т.д. Этого недостаточно для обработки? Что еще вы ищете?

Отформатировать его при необходимости.

Я могу вернуть полученные данные как атомы, списки, бинарные капли, форматированные строки, числа и т.д. Что в этом нет в Erlang? Я действительно честно смущен здесь.

Ответ 8

Вы когда-нибудь использовали LINQ?

Если да, то поздравляем. Вы использовали функциональный язык в практическом контексте. Вот о чем идет функциональное развитие.

И да, F # ОЧЕНЬ полезно.

Ответ 9

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