Почему функциональное программирование не более популярно в отрасли? Это завоевывает популярность сейчас? [закрыто]

61

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

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

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

Jonas
источник
3
В какой-то степени я не согласен с предпосылкой вашего вопроса. Языковые функции, вдохновленные «функциональными языками», добавляются в такие языки, как Java и JavaScript. На самом деле JavaScript всегда был (в некотором смысле) функциональным языком, хотя многие люди не осознавали этого до недавнего времени.
MatrixFrog
1
@MatrixFrog: Кто-то может спросить: «Зачем идти функциональным только наполовину, добавляя несколько функциональных концепций к нефункциональным языкам вместо принятия полноценного языка FP? Ведь парадигма существует уже много лет и является очень зрелой».
Джорджио
Мир не переключается на превосходные альтернативы (а чистая FP - превосходная альтернатива) по разным причинам, включая обратную совместимость, инерцию и т. д. Рассмотрим раскладку клавиатуры DVORAK: она более эффективна для сенсорного ввода, но мы все придерживаемся QWERTY просто потому, что в ней так много программного обеспечения с qwerty-дружественными ярлыками.
КолА

Ответы:

38

Я бы сказал, что одной из причин того, что функциональное программирование не является более распространенным, является отсутствие базы знаний. Мой опыт показывает, что корпорации очень склонны к риску с точки зрения внедрения технологий, которые не являются основным потоком и предпочитают инвестировать в проверенные и настоящие фреймворки (java, c ++, c #). Только тогда, когда есть потребность бизнеса (как в Ericsson), новые парадигмы рассматриваются. Но даже в случае Эрикссон я слышал, что руководство потребовало использования c ++, и Джо Армстронг был вынужден кодировать вызовы erlang на c ++ !! Это должно показать, как корпорации неохотно внедряют новые технологии!

ennuikiller
источник
9
Как функциональное программирование каким-то образом «новое»?
Эван Плейс
7
Я думаю, что он имел в виду «неиспользованный» вместо «новый».
Винко Врсалович
10
Так что это не используется ... потому что это не используется? Гектометр
Алекс Бараноски
21
@ Алекс - Точно. Отстой, не так ли?
KeithS
5
@ Stargazer712: Каковы эти причины? Я знаю многих разработчиков, которые не знают функционального программирования, поэтому невежество имеет смысл для меня. Был ли у функционального программирования огромный провал в прошлом, который отогнал индустрию от него, о котором я не знаю?
Шон Макмиллан
67

Я был профессором, и, как программисты, профессора всегда ищут Next Big Thing. Когда они думают, что нашли один, они делают его победителем, и все накапливаются. Поскольку они проповедуют студентам, которые считают, что профессора должны быть очень умными, иначе почему они будут профессорами, они не получают никакого сопротивления.

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

Учитывая это, функциональное программирование - это всего лишь одна стрелка в вашем колчане, а не единственная, точно так же как ООП не единственная.

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

Майк Данлавей
источник
1
Это действительно хороший комментарий. +1 к стрелкам в колчане и диапазон решений с компромиссами.
user21007
2
+1 за КК. Этот MSc был бы гораздо полезнее с отдельными предметами, охватывающими тестирование, обзор кода, сложность кода и тому подобное. Возможность автоматически проверять, что программа делает то, что должна, после последнего патча, стоит любого количества «она должна работать сейчас», волнистая тарабарщина.
10
5
@ l0b0: Спасибо, хотя на самом деле я думал о контроле качества того, что преподается и как. Как таковые, профессора CS просто учат тому, что лично им кажется наиболее интересным. Сравните это с разработкой, где есть взаимодействие с промышленностью или медициной, где актуальность в реальном мире очень высока. IME, профессионалы CS полагают, что реальный мир будет учить тому, что важно в реальном мире, но студенты не хотят учиться - скорее, они стремятся прозелитизировать то, что профессионалы больше всего взволновали.
Майк Данлавей
@Mike: почти любой современный язык? Вы включаете C ++ и Java?
Кевин Клайн
+1. Сам не мог бы сказать это лучше.
Прогулка
25

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

Fishtoaster
источник
48
Я не согласен. Функциональные языки программирования пытаются минимизировать использование состояния и тем самым становятся менее сложными. Программы, запрограммированные на функциональном языке, также легче тестировать и проводить рефакторинг.
Джонас
7
@Jonas: многим программистам очень сложно написать программу, в которой практически нет состояния (включая меня). С этой точки зрения, это на самом деле более сложный. (Обратите внимание, что я не обсуждаю полезность функционального программирования любыми способами!)
ShdNx
3
@ShdNx: Да, я знаю. Даже я думал, что функциональное программирование было трудно, когда я впервые изучил его в университете. Но через некоторое время я начал отдавать предпочтение императивному программированию и более конкретному ООП. В моем университете функциональное программирование преподавалось до императивного программирования, и студенты, которые не занимались программированием до того, как в университете думали, что императивное программирование было очень трудным в начале, и что функциональное программирование ближе к математике.
Джонас
16
Есть разница между сложностью и сложностью. ООП определенно сложнее, чем структурированное программирование, потому что оно добавляет больше концепций. Для достаточно больших объемов кода они уменьшают сложность, предоставляя структуру коду. FP - это то же самое: если вы пишете только две строки, это кажется излишним, но если ваш код достаточно большой, то структурирование кода как субъединиц без сохранения состояния улучшает масштабируемость и уменьшает сложность кода.
Мухаммед Алкарури
6
Одним из основных акцентов функционального программирования является возможность компоновки. Если это не инструмент для управления сложностью, я не знаю, что это такое.
dan_waterworth
23

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

Например, созданный мной стартап использует функциональный язык (Clojure) в качестве основного языка разработки по следующим причинам:

  • Производительность - изучать FP сложно, но как только вы освоите его, его очень трудно превзойти с точки зрения силы и выразительности. Я, вероятно, пишу около 1/10 от количества строк для реализации какого-либо компонента функциональности по сравнению с тем, что мне понадобилось бы в C # или Java

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

  • Параллелизм - функциональные языки подчеркивают неизменность, что дает огромные преимущества для параллельных приложений, чем необходимость эффективной работы на нескольких ядрах. И нравится это или нет, но будущее за несколькими ядрами. См. Http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey для блестящего объяснения того, почему это так важно

  • Композиционность / модульность - функциональные языки, по-видимому, легче объединяют компоненты, чем сложные ОО-системы. Я до сих пор не выяснил всех причин этого, но отчасти это связано с тем, что у вас нет всей «случайной сложности», которую модели OO таскают с собой. Доклад Стюарта Хэллоуэя о радикальной простоте раскрывает эти идеи гораздо глубже.

РЕДАКТИРОВАТЬ : В ответ на комментарий Деспертара, примером «случайной сложности» систем ООП, которая ограничивает модульность, являются проблемы с глубоким клонированием или мелким клонированием: вы не можете составлять объекты вместе и передавать их как составные структуры без тщательный анализ семантики клонирования и мутации. В небольших случаях это управляемо, но в сложных системах это быстро становится серьезной проблемой. Эта проблема не будет существовать в первую очередь, если вы полагаетесь на чисто функциональные структуры данных.

mikera
источник
+1, мне было бы очень интересно услышать ваш процесс принятия решения о том, почему вы выбрали Clojure. (Я не за или против Clojure, мне просто интересно).
dan_waterworth
4
«Изучение FP - это сложно»: выучить любую парадигму сложно. Я помню, сколько часов я провел с императивным кодом (Паскаль), прежде чем у меня хватило опыта, чтобы быть достаточно продуктивным. Я думаю, что FP менее известен, потому что многие программисты сначала выучили императивный язык, и как только они научились программировать, у них не было времени взглянуть на что-то еще. Я полный рабочий день программиста на C ++, и в настоящее время я изучаю Scala вечером после работы. Если бы у меня была семья, чтобы заботиться, я мог бы просто забыть об этом.
Джорджио
1
Я думаю, что первые 3 - отличные случаи, однако я не согласен с 4-м. ООП является чрезвычайно модульным и композиционным; для меня это одна из его сильных сторон. Он также отлично скрывает сложность через инкапсуляцию и абстракцию.
Despertar
1
@Giorgio. Именно так. «Изучать FP сложно, а изучать ООП легко» - это так же абсурдно, как «Изучать испанский - сложно, а китайский - легко». Это зависит от того, какой из них был вашим первым языком. И я не выбрал китайский в качестве произвольного аналога ООП - потому что идиомы ОО похожи на иероглифы: их легко выучить по одному, но трудно запомнить их все и невозможно составить. FP намного больше похож на язык с алфавитом: отдельные буквы бесполезны в отдельности, но позволяют составлять что угодно с достаточно небольшим набором правил
KolA
1
(продолжение) так почему же это не популярно - пока - по тем же причинам. Иероглифы существовали задолго до того, как был изобретен и созрел первый алфавит. Это может занять другое поколение, у которого алфавитное письмо и чтение я имею в виду FP в качестве своей первой парадигмы
KolA
12

Отсутствие приложения убийцы

Эй, этот здесь выглядит свежо. (копать копать копать)

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

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

  • C: Работает везде (это был конец 70-х и 80-х)
  • C ++: GUI-фреймворки (начало 90-х)
  • Ява: апплеты и сервлеты (в конце 90-х)
  • Objective-C: приложения для iOS (до этого приложения для OS X)
  • Рубин: Рельсы
  • C #: ASP.NET, WinForms
  • PHP: Wordpress и др.
  • Javascript: AJAX, особенно через фреймворки
  • Луа: Сценарии игр, особенно WoW

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

Одно очень важное замечание об этом списке: «Ниша» языка, как указывает приложение-убийца, становится все более конкретной с течением десятилетий. Обратите внимание на последнее в списке: сценарии игр , в частности. Языкам становится все труднее привлекать внимание из-за списка вещей, которые уже достаточно хорошо сделаны другим языком.

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

  • Emacs Lisp: Постоянное использование разработчиками в Emacs с 80-х годов. ( Вряд ли когда-либо используется где-либо еще.)
  • Эрланг: Везде, где вы хотите много одновременных агентов.
  • Схема: образование
  • APL / J / K: Финансы (давайте назовем их функционалом ради аргумента)
  • Common Lisp: «ИИ» - это то, что люди обычно говорят, для чего он используется, что является благословением и проклятием.

Теперь, единственный основной язык, который я чувствую, что я оставил из этого обсуждения, это Python. Python сделал что-то очень интересное; он преуспел, не выглядя победителем в любой крупной нише. Это может означать, что я совершенно не прав, рассматривая таким образом популярность языка. Это также может означать, что достаточно хороший язык может стать популярным без приложения-убийцы, чтобы стимулировать принятие и принятие, но это очень сложно и может занять очень много времени. (У Perl похожая история, но она появилась несколькими годами ранее и сейчас имеет меньшее распространение.)

Исходя из этого, я могу сказать, какие функциональные языки, на мой взгляд, находятся на подъеме:

  • Clojure: веб-программирование, особенно через Героку
  • Scala: Lift (или, может быть, Play, в наши дни) - JVM без Java

Если бы вы спросили меня, где искать популярные функциональные языки, я бы сказал, что нужно искать функциональный язык с разработкой «под ключ» облачных вычислений (а-ля Heroku или GAE) или разработкой мобильных приложений под ключ.

Джесси Милликен
источник
Я бы также назвал Perl основным языком. Я бы сказал, что это более старый язык, который чаще всего используется в Unix-подобных системах. Хотя Python кажется более современной альтернативой. Это все еще популярный язык, которому уделяется много внимания и большое сообщество.
Despertar
1
@Despertar - я не особенно старался быть равноправным в отношении того, какие языки я упомянул :) И согласился, история похожа на Python, за исключением нескольких лет в прошлом.
Джесси Милликен
1
Perl действительно есть несколько ниш. Самый ранний из них был отражен в более старых версиях его документации, в которой название называлось аббревиатурой от «практического языка извлечения и отчетности». Второй пришел немного позже, и был CGI сценариев - в течение многих лет, Perl был языком в Интернете. Очевидно, что сейчас он потерял большую часть этой популярности, но взгляните на старые веб-сайты, которые все еще работают на том же программном обеспечении, с которым они были изначально созданы, и вы увидите много Perl (я думаю о slashdot.org, прямо сейчас , но есть еще немало).
Жюль
9

По той же причине, по которой Лисп так и не завоевал популярность (пусть начнутся огненные войны!). Функциональное программирование - очень чуждая парадигма по сравнению с императивным и объектно-ориентированным программированием. Если, как и подавляющее большинство учеников CS, вы начали с C и перешли на C ++ / Java, вы, как правило, не хотите учиться мыслить так, чтобы это было абсолютно ортогонально тому, как вы обычно думаете.

Чинмай Канчи
источник
2
Чужая парадигма? Это ближе к математике, чем императивное программирование. Здесь, в Швеции, я думаю, что большинство студентов CS в университете - это прежде всего функциональное программирование. Например, мы начинали со Standard ML, до C, Erlang и Java.
Джонас
4
Справедливо. Я знаю, что многие студенты-инженеры в Великобритании и Индии сначала изучают C, а затем C ++ и / или Java. Часто их вообще не учат функциональному языку.
Чинмай Канчи
14
@Jonas Для многих людей математика - парадигма инопланетян, и все, что отводит программирование от математики, облегчает понимание.
scriptocalypse
5
Я слышал о людях, которые никогда не слышали о деревьях, не говоря уже о программировании функций, окончив.
dan_waterworth
1
@ Tux-D, вообще-то нет, я говорю о студентах в Великобритании.
dan_waterworth
6

Давайте рассмотрим бизнес и программирование.

Есть предприятия, которые используют свое программное обеспечение в качестве стратегического актива. Это не типично. Для большинства предприятий ИТ - это то, что поддерживает реальный бизнес компании. Это необходимый расход. Они консервативны, потому что знают, что за $ X они могут получить необходимые им ИТ-ресурсы, а если они переключатся на что-то другое, они сэкономят менее $ X, если все пойдет хорошо, и потеряют по-настоящему большие, если все пойдет плохо.

Более того, в бизнесе самая дешевая вещь - это то, что они делали вчера. Изменение, однако, желательно, стоит дорого. Если бы компания перешла от, скажем, решения C # / .NET, даже к F #, у них были бы проблемы. Их программисты (которые, вероятно, не самые проницательные программисты) должны будут выучить новый язык, быть опытными в обоих и часто использовать оба языка. Там будут подпрограммы, написанные на обоих в течение длительного времени. Если бы они перешли на что-то вроде Haskell, или если бы они в первую очередь использовали C ++ / MFC, они бы изменились намного больше, и это было бы намного дороже.

Кроме того, в течение долгого времени ожидается поставка программистов на C # и продолжение поддержки Microsoft. На нынешние ИТ-практики можно рассчитывать. Не существует такого же уровня институциональной поддержки или гарантии постоянной доступности программистов.

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

Дэвид Торнли
источник
2

Вы уже пишете код в функциональном стиле, просто вы этого не знаете.

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

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

Calmarius
источник
1

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

Вот:

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

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

Джон Фишер
источник
0

Настоящая проблема - это государство.

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

Но мы запускаем код на машинах с архитектурой Von-Neuman, которые по своей природе полны состояния. Таким образом, мы на самом деле не избавились от состояния, функциональные языки просто скрывают сложность состояния от разработчика. Это означает, что язык / компилятор должен иметь дело с состоянием за кулисами и управлять им.

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

Таким образом, возникает вопрос: может ли язык эффективно управлять состоянием за смыслом? Особенно, когда размер данных намного превышает размер архитектуры.

Глядя на это с аппаратной стороны

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

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

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

Глядя со стороны промышленности:

В промышленности много неэффективных штатных программистов.

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

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

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

С точки зрения найма

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

Мартин Йорк
источник
2
Функциональные языки, особенно «нечистые» функциональные языки, могут прекрасно справляться с глобальным состоянием. Я обнаружил, что часто программы разлагаются на чередующиеся уровни: например, глобальное состояние ... но переходы функционального состояния ... со случайным локальным (замаскированным) состоянием для реализации критичных к производительности частей этих переходов и т. Д. Проблема с императивными языками, IMO заключается в том, что они часто приводят программистов к неправильному использованию состояния, когда функциональные шаблоны будут работать лучше. Но языки, похоже, развиваются в направлении поддержки обоих стилей.
Райан Калпеппер
1
Очень легко иметь дело с состоянием в функциональных языках, но это требует изменения акцента. В то время как в императивных языках вы пишете процедуры, которые изменяют состояние, в функциональных языках вы пишете функции, которые возвращают процедуры, которые изменяют состояние.
dan_waterworth
«Функциональные языки не имеют глобального состояния» - вам не нужно глобальное состояние. Практически все государственное управление может осуществляться через монады.
Арунав Саньял
-3

Этот вопрос имеет несколько неправильную предпосылку. По следующим причинам:

  1. Функциональное программирование на самом деле довольно распространено в отрасли. Но он используется только там, где есть опытные программисты. Нельзя ожидать, что новички это знают. Почти все крупные программные проекты используют его, но они просто держат его в областях, которые обрабатываются опытными программистами. Новички будут иметь дело с простыми модулями, которые не требуют функционального программирования.
  2. Учитывая эту реальность, компании, которые нанимают людей (обычно молодых, поступающих из университета), не могут на самом деле запросить опыт функционального программирования. Любой, кто участвует в проектах, требующих функционального программирования, уже 15 лет работает в одной компании.
  3. Университеты начинают учить этому, потому что уже сейчас знают, что знания по функциональному программированию будут очень полезны через 30 лет. Их временной диапазон составляет 30 лет, а не нормальное полугодие, как в компаниях.
  4. Эти моменты являются причиной того, что люди разочаровываются, когда входят в рабочую силу и видят, что то, что они узнали в университете, не используется. Но они были рассчитаны на 30 лет, и в конечном итоге это будет полезно - просто компании используют простые вещи - то, что они могут ожидать от людей.
  5. Также вы были бы высокомерны, если думаете, что после нескольких лет обучения в университете вы достаточно хорошо знаете функциональное программирование, чтобы использовать его в реальных программных проектах. Начните с простых вещей в первую очередь. Вам не нужно делать самое сложное программное обеспечение в качестве первой задачи, когда вы начинаете работать. Вы в конечном итоге доберетесь до сложных вещей, но это займет время.
ТР1
источник
2
1) «Почти все крупные программные проекты используют его». Мой опыт показывает, что это далеко от реальности. Очень немногие компании используют функциональное программирование как то, что я знаю. Большинство используют только Java и C # (хотя C # получили более функциональные конструкции за последние несколько лет), C ++ и C.
Jonas
2
2) Мой опыт противоположен. Люди из университетов, кажется, единственные, кто знает функциональное программирование. Здесь, в Швеции, большинство университетов преподают функциональное программирование с первого курса. А такие университеты, как MIT, до недавнего времени использовали функциональное программирование в своем первом курсе программирования (Схема).
Джонас
@jonas: нет, язык программирования не имеет к этому никакого отношения. Конечно, C и C ++, Java и т. Д. Используются большим количеством проектов. Функциональное программирование также работает в коде c ++. Похоже, что нынешняя практика заключается в том, что часть проекта использует ОО, а часть - функциональное программирование. Обе части используют один и тот же язык (обычно c / c ++)
tp1
Да, вы могли бы сделать OO в Си тоже. Но это не рекомендуется. C и C ++ не имеют много конструкций для функционального программирования, например, не являются неизменяемыми по умолчанию, нет хорошей поддержки сопоставления с образцом, нет включаемых неизменяемых структур данных и т. Д.
Jonas
Ну, поэтому для этого нужны опытные программисты. Поскольку изменить язык программирования по сравнению с обычным языком практически невозможно, следующая лучшая вещь - это функциональное программирование на c ++. Также в c ++ есть такие вещи, как const, которые очень помогают.
ТР1
-10

Потому что сложнее отлаживать FP.

Interstar
источник
11
Я не согласен. Без побочных эффектов процесс отладки становится проще. Может быть, вы думаете, что это сложнее, потому что функциональная парадигма отличается и требует опыта, чтобы освоиться с новым способом выполнения задач, включая отладку.
Маньеро
2
Функциональные языки программирования на самом деле проще тестировать, поскольку чистые функции не сохраняют состояния.
Джонас
4
Джонас, я не сказал «тест», я сказал «отладка», т.е. найти ошибку, которую вы сделали. Тестирование является частью этого, так же, как и рассуждения о программе и т. Д. - я поддерживаю это. Это функция силы FP. Чем больше работы выполняет конкретная строка кода, тем сложнее определить, какая строка кода вызывает проблему. Отображение между строкой кода и эффектом является более размытым, например. одна функция высшего порядка может затрагивать десятки вариантов поведения программы и наоборот. Симптомы могут сильно отличаться в разных точках для одной и той же ошибки.
Interstar
По моему опыту это совсем не сложно отлаживать. Я использую F # и не могу найти причину, по которой вам будет сложнее отлаживать, чем, например, C #. Может быть, отладка в Haskell сложнее из-за лени (я понятия не имею), но готовое программирование на FP проще из-за отсутствия состояния, как сказал Джонас. Другими словами, код FP более предсказуем, потому что вы знаете, что на результат не влияют невидимые переменные.
Мухаммед Алкарури
2
Пока ваши функции чисты, отладка проста. Если вы не можете отлаживать, добавляя юнит-тесты, значит, вы не выполняете адекватную работу по написанию тестов.
dan_waterworth