Потому что все эти преимущества также являются недостатками.
Программы без гражданства; Нет побочных эффектов
Реальные программы все о побочных эффектах и мутации. Когда пользователь нажимает кнопку, это потому, что он хочет, чтобы что-то произошло. Когда они вводят что-то, они хотят, чтобы это состояние заменило то, что было раньше. Когда Джейн Смит в бухгалтерии выходит замуж и меняет свое имя на Джейн Джонс, база данных, поддерживающая бизнес-процесс, который печатает ее зарплату, должна быть направлена на обработку такого рода мутаций. Когда вы стреляете из пулемета по инопланетянину, большинство людей мысленно не моделируют это как конструкцию нового пришельца с меньшим количеством очков жизни; они моделируют это как мутацию свойств существующего пришельца.
Когда концепции языка программирования в основном работают против моделируемой области, трудно оправдать использование этого языка.
Параллелизм; Очень хорошо играет с растущей многоядерной технологией
Проблема просто решена. С неизменяемыми структурами данных вы получаете дешевую безопасность потоков за счет возможной работы с устаревшими данными. Благодаря изменяемым структурам данных вы всегда можете работать с свежими данными за счет необходимости написания сложной логики для обеспечения согласованности данных. Это не похоже на то, что один из них явно лучше другого.
Программы обычно короче, а в некоторых случаях их легче читать
За исключением случаев, когда они длиннее и их сложнее читать. Научиться читать программы, написанные в функциональном стиле, - сложный навык; кажется, что люди гораздо лучше воспринимают программы как последовательность шагов, которые нужно выполнить, как рецепт, а не как последовательность вычислений, которые необходимо выполнить.
Производительность повышается (пример: Эрланг)
Производительность должна значительно повыситься, чтобы оправдать огромные расходы по найму программистов, которые знают, как программировать в функциональном стиле.
И помните, вы не хотите выбрасывать работающую систему; большинство программистов строят не новые системы с нуля, а поддерживают существующие системы, большинство из которых были построены на нефункциональных языках. Представьте себе попытку оправдать это перед акционерами. Почему вы отказались от своей действующей системы начисления заработной платы, чтобы создать новую систему стоимостью в миллионы долларов? «Потому что функциональное программирование - это круто» вряд ли порадует акционеров.
Императивное программирование - очень старая парадигма (насколько я знаю) и, возможно, не подходящая для 21-го века
Функциональное программирование тоже очень старое. Я не понимаю, насколько важен возраст концепции.
Не пойми меня неправильно. Я люблю функциональное программирование, я присоединился к этой команде, потому что хотел помочь перенести концепции функционального программирования в C #, и я думаю, что программирование в неизменном стиле - это путь будущего. Но программирование в функциональном стиле сопряжено с огромными издержками, от которых просто невозможно избавиться. Переход к более функциональному стилю будет происходить медленно и постепенно в течение десятилетий. И это то, что будет: переход к более функциональному стилю, а не массовое признание чистоты и красоты Haskell и отказ от C ++.
Я создаю компиляторы для жизни, и мы определенно придерживаемся функционального стиля для следующего поколения инструментов компилятора. Это потому, что функциональное программирование в основном хорошо подходит для тех проблем, с которыми мы сталкиваемся. Все наши проблемы связаны с получением необработанной информации - строк и метаданных - и преобразованием их в разные строки и метаданные. В ситуациях, когда происходят мутации, как, например, кто-то печатает в IDE, проблемное пространство по своей природе поддается функциональным методам, таким как постепенное восстановление только тех частей дерева, которые изменились. Многие домены не имеют этих приятных свойств, которые делают их явно поддающимися функциональному стилю .