Уместно ли функциональное программирование в веб-разработке? [закрыто]

88

В последнее время я так много видел о функциональном программировании, и Clojure выглядит особенно интересным. Хотя я «понимаю» основное описание того, что это такое, я не могу понять, как я буду использовать его в повседневной жизни в качестве веб-разработчика, если вообще могу. Многое из того, что я прочитал, сосредоточено на математической стороне функционального программирования, а не на типичных ситуациях программирования, встречающихся в обычном объектно-ориентированном программировании.

Я ошибся концом палки? Функциональное программирование совершенно не связано с веб-разработкой? Если нет, то есть ли примеры его использования «в Интернете»?

Ненавидит_
источник

Ответы:

31

Несколько примеров из моей головы:

  • Yahoo! Магазин работает на Lisp ( до приобретения изначально назывался Viaweb )
  • Reddit был полностью прототипирован на Lisp, хотя они перешли на Python в 2005 году.
  • Hacker News полностью написан на Arc (диалект Лиспа).
Грег Кейс
источник
7
Yahoo! Несколько лет назад Store был переписан на c ++.
APG
5
язык! = парадигма программирования.
phkahler
58
Странный выбор примеров ... Yahoo! Store был написан Полом Грэмом, большим сторонником Lisp. Он также написал Hacker News, который, по сути, является клоном Reddit. Предположительно, HN был написан в некоторой степени в ответ на переход Reddit с Lisp на Python, в то время как ребята из Reddit были частью YCombinator: программы-ускорителя, которую запускает Пол Грэм. Я бы посчитал это ОДНИМ примером, а не тремя.
Брэндон Блум
Конфигурация сервера @ShermPendley, настройка сети и доступ к базе данных также являются основными факторами производительности. Время выполнения скриптов веб-приложений обычно составляет крошечную долю от общей стоимости.
AgmLauncher
62

Функциональное программирование очень хорошо сочетается с веб-приложениями. Веб-приложение получает HTTP-запрос и выдает результат HTML. Это можно рассматривать как функцию от запросов к страницам.

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

JacquesB
источник
20

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

Шерм Пендли
источник
20

Чисто функциональное программирование может не очень хорошо соответствовать среде веб-программирования. Но главным препятствием является просто отсутствие инфраструктуры (фреймворков и API). Пройдет много времени (возможно, никогда, если честно), прежде чем функциональный язык станет столь же богатой средой веб-программирования, как Java, Python или Ruby.

Тем не менее, есть несколько вариантов.

  • HAppS - сервер веб-приложений Haskell
  • Страницы сервера Haskell
  • Ссылки - функциональный язык веб-программирования
  • mod_caml - модуль OCaml CGI для Apache
  • Ocsigen / Eliom - веб-сервер / среда программирования OCaml
  • OPA - фреймворк для коммерческих веб-приложений
  • Yesod - веб-фреймворк для Haskell

У меня нет опыта ни с одним из них. Может быть, комментаторы смогут взвесить то, что им понравилось.

Крис Конвей
источник
4

Для Clojure есть интересный стартап (TheDeadline), разработанный с использованием Clojure и Google App Engine. У них есть хороший ppt на Slideshare и интервью на InfoQ.

Хорошее обсуждение развертывания Clojure с GAE: http://news.ycombinator.com/item?id=1239788

Насколько мне известно, в Clojure есть несколько библиотек для веб-разработки. Compojure Ring Conjure

Надеюсь, это ответит на некоторые из ваших вопросов =) (Я тоже только начинаю ..)

С уважением, Райан

Райан Тео
источник
3

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

Обновление: есть веб-фреймворки для функциональных языков. Веблоки для Common Lisp, Lift для Scala. Это те, о которых я слышал, их может быть больше ... однако вам не обязательно быть чисто функциональным - например, Scala не является чистым и должен работать с любой структурой Java, вы все равно сможете использовать функциональное программирование для бизнес-уровня и т. д.

Немецкий
источник
3

Проверьте Ur / Web . Он очень быстрый, а его система статических типов знает о таких вещах, как HTML и SQL, поэтому может гарантировать всевозможные приятные вещи в отношении безопасности.

Сайрус Омар
источник
3

Кажется, что Erlang все чаще используется в инфраструктуре масштабируемых веб-приложений. базы данных CouchDB и Riak написаны в основном на Erlang, как и сервер очередей сообщений RabbitMQ. Одним из ключей к его успеху является то, что он обрабатывает параллелизм посредством передачи сообщений без общего изменяемого состояния. Такой способ размышления о проблемах полезен больше, чем какой-либо конкретный язык функционального программирования.

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

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

Питер Скотт
источник
2

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

Чак Макнайт
источник
2

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

Маркус Вестин
источник
2

Мы только что запустили электронную таблицу, в которой серверная часть полностью написана на Erlang.

http://hypernumbers.com

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

Гордон Гатри
источник
2

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

A_Var
источник
1

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

По крайней мере, это моя причина.

rbanffy
источник
1

Еще один короткий ответ: http://www.mlstate.com - полноценная платформа для веб-разработки, основанная на FP. Чистая семантика языка допускает всевозможные автоматизированные анализы безопасности, оптимизации и т. Д.

Предупреждение: я работаю там.

Йорик
источник
1

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

гопи
источник
0

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

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

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

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

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

Функциональное программирование в веб-разработке:

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

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

• WebSharper (F #)

• Snap (Haskell)

• Лифт (Scala)

• Ocsigen (OCaml)

• Chicago Boss, Zotonic (erLang)

Надеюсь, что мой ответ поможет кому угодно.

Амит Агравал
источник
-2

Вы, вероятно, не будете его использовать и не должны его использовать, но когда вы говорите, что кто-то всегда найдет исключение из правила (Viaweb и т. Д.). В принципе, нет никакого "суперязыка", есть только рабочие строчки кода, обычно на "Blub". Даже Пол Грэм говорит, что главное (фактически единственное) преимущество Lisp - это способность быстро создавать прототипы.

Кроме того, «суперязыки» обычно мешают, а не повышают читаемость кода, а это означает, что тот «гений», который написал его, должен поддерживать его вечно, поскольку никто другой не может его понять, тем более что он, скорее всего, напишет его на своем модифицированном диалекте. Это уменьшает возможный объем любого проекта, а это означает, что даже если новые, инновационные вещи могут быть реализованы, они не являются расширяемыми и поэтому остаются в относительно небольшом масштабе (например, Hacker News в Arc).

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

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

Джоэл
источник
1
На самом деле, Пол Грэм говорит, что большим преимуществом Lisps является то, что это «самый мощный» доступный язык. Он поддерживает свой аргумент, говоря, что примерно четверть viaweb (по строкам) было макросами Lisp. Мета-программирование на большинстве языков (особенно тех, которые были доступны в середине 90-х годов) - сложная задача. Это не прототип, если он отправлен на рабочий сервер.
nmichaels