Функциональный стиль - это неизменяемые переменные и функции без побочных эффектов. Причём, неизменяемые переменные - это синтаксический сахар для вызова функции.
Функциональный язык Erlang.довольно успешно используется для асинхронного программирования.
сперва библиотеки промисов-монад-колбеков
Я не знаю, какое отношение к ФП имеют колбаки. А вот async/await в современные языки пришли из функционального программирования, как одна из монад.
а мне и не требуется это делать.
Вы ссылаетесь на Ваше недоказанное утверждение, что популярность языка определяется его качеством/удобством.
мы имеем самые распространённые языки, на которых пишется подавляющее большинство современного ПО.
Так исторически сложилось.
Во времена медленных компьютеров для создания эффективных программистам требовался "ассемблер высокого уровня". Эту нишу занял Си.
Когда процедурные языки перестали справляться с возросшей сложностью создаваемых продуктов, появилось ООП. При этом "выстрелили" исключительно языки с привычным си-подобным синтаксисом.
Сейчас компьютеры достаточно мощные для использования функциональных языков. Но рост их популярности сдерживается большим количеством легаси кода и необходимостью переобучения программистов. Стандартное решение - добавление ФП в имеющиеся языки (как раньше добавили ООП в Си).
з.ы. Питон - простой язык для инженеров и других непрограммистов. Для серьёзных проектов его не используют.
open FSharp.Data
for x in HtmlProvider<"http://en.wikipedia.org/wiki/The_world's_100_most_threatened_species">.GetSample()
.Tables.``Species list``.Rows |> Seq.filter (fun x -> x.Type.Contains("Amphibian"))
do printfn "%s - %s" x.``Common name`` x.Type
давайте лучше, ну, например, крестики нолики опишем
В чистые ФП системы при этом я тоже не особо верю.
В веб приложениях эти 10% императивного кода заменяет браузер.
Есть приложения для обработки потоков данных.
Есть приложения типа Ejabberd (написан на erlang).
А для дестопных ГУИ приложений есть реактивный интерфейс. Правда, лично я с десктопными приложениями не знаком. Не могу сказать, насколько это удобно по сравнению с ООП ГУИ интерфейсом.
На этой странице есть таблица с одноимённым названием. Нужно выбрать из таблицы всех черепаховых (название типа содержит "turtle") и вывести в консоль.
Сколько строк займёт программа на PHP? Использование сторонних (популярных) библиотек для сокращения кода - приветствуется.
Пример с браузерной игрой не вполне удачен, т.к. wasm всё-таки уже везде завезли достаточно стабильно.
Я говорю о популярности. Ещё до wasm появились трансляторы из других языков (включая функциональные) в JavaScript. То есть, сейчас возможно написать сайт целиком, например, на F#. Но большинство, по-прежнему, разрабатывает клиентскую часть на JavaScript.
может вытекать из синтаксиса языка
Может и из синтаксиса, но чаще - по другим причинам. Поэтому неправильно сравнивать удобство синтаксиса по популярности.
Например, я не знаю ни одного преимущества C# над F#, кроме "его знает больше народу".
Вы написали, что из двух описанных мной молотков лучше тот, которым забивают больше гвоздей. Значит, глядя на молотки, Вы не можете определить, какой из них лучше.
Запросто: ряды Фибоначчи не применяются буквально нигде.
Обоснуйте Ваш тезис, что ФП подходит только для программирования ряда Фибоначчи. Нужность рядом Фибоначчи для данной дискуссии не имеет значения.
Когда-то Perl был более распространён чем Python.
Уточню мои рассуждения. Предположим, что качество можно измерять популярностью (как Вы предлагаете). Когда-то Лисп был более распространён, чем Си. Следовательно, в тот момент Лисп был лучше, чем Си. Позже Си стал лучше, чем Лисп. При этом синтаксис этих языков не поменялся. Приходим к противоречию (Лисп лучше, чем Си, а Си лучше, чем Лисп)..
Выяснилось, что разработчики делающие хоть что-то полезное НЕ выбрали молоток ФП.
Выбор языка для проекта определяется несколькими факторами. Наиболее важные из них:
Наличие транслятора для целевой платформы Например, браузерную игру никто не будет писать на Си, так как нет транслятора, переводящего код Си в инструкции, которые могут исполнять популярные браузеры
Наличие подходящего готового кода Под готовым кодом подразумеваются не только библиотеки, фреймворки, движки (например, для игр), но и предыдущие версии продукта.
Наличие специалистов
Как видим, в список наиболее важных факторов синтаксис языка не входит. Поэтому популярность языка не пропорциональна качеству/удобству его синтаксиса.
То есть, Вы не можете взять два разных молотка и определить, какой из них лучше/удобнее для забивания гвоздей? Значит, Вы оцениваете не качество инструмента, а что-то другое.
Им хочется ощущать причастностьк чему-то важному, недоступному для других.
Вы ошибаетесь. Ничего такого мне не хочется.
А в остальном ФП подходит только для программирования никому не нужного ряда Фибоначчи, ну и факториала.
Обоснуйте. (Аргумент "весь мир" не состоятелен).
весь мир для задач посложнее использует
Когда-то Лисп был более распространён, чем Си. Когда-то предпочитали лошадь трактору. Выбор инструмента определяется множеством факторов, а не тем, какой лучше.
вот есть у вас дома молоток. Но его польза исчисляется именно количеством гвоздей, что вы им забили. Если не забили ни одного, то молоток - совершенно бесполезная (для Вас) вещь.
У меня есть два молотка. Один - старый с деревянной ручкой, который достался от дедушки. Второй - новый, современный (с прорезиненной рукоятью и т.д.). Какой из них лучше?
Для меня очевидно, что второй лучше и удобней. Для Вас лучше тот, которым я забиваю гвозди.
Функциональное программирование противоречит строению психики человека
100% опрошенных мной детей в возрасте 13 лет сказали, что Хаскель проще для понимания, чем Питон. Что на Хаскель проще писать программы. (Всего был опрошен один ребёнок :) ).
Питон кажется более простым для тех, кому успели "сломать мозг" циклами и прочей императивщиной. Очевидно, что декларативный SQL для поиска данных удобней (выразительней) императивного Си.
Функциональный стиль - это неизменяемые переменные и функции без побочных эффектов. Причём, неизменяемые переменные - это синтаксический сахар для вызова функции.
Функциональный язык Erlang.довольно успешно используется для асинхронного программирования.
Я не знаю, какое отношение к ФП имеют колбаки. А вот async/await в современные языки пришли из функционального программирования, как одна из монад.
Вы ссылаетесь на Ваше недоказанное утверждение, что популярность языка определяется его качеством/удобством.
Так исторически сложилось.
Во времена медленных компьютеров для создания эффективных программистам требовался "ассемблер высокого уровня". Эту нишу занял Си.
Когда процедурные языки перестали справляться с возросшей сложностью создаваемых продуктов, появилось ООП. При этом "выстрелили" исключительно языки с привычным си-подобным синтаксисом.
Сейчас компьютеры достаточно мощные для использования функциональных языков. Но рост их популярности сдерживается большим количеством легаси кода и необходимостью переобучения программистов. Стандартное решение - добавление ФП в имеющиеся языки (как раньше добавили ООП в Си).
з.ы. Питон - простой язык для инженеров и других непрограммистов. Для серьёзных проектов его не используют.
Вы пока ни одного такого примера не привели. Тот же пакман через функциональное описание в 1.5 раза лаконичнее.
А зачем нужны многострочные анонимные функции?
Зато ниша, где ФП лаконичней и выразительнее, очень широка. Именно поэтому в ООП языки добавляют ФП.фичи.
Главные ФП фичи - неизменяемые переменные и чистые функции.
Можете код привести?
Вот код на F#:
Пакман устроит?
https://fable.io/repl/ (загрузите соответствующий пример)
С подробными комментариями 700 строк. Транслируется в 900 строк JavaScript (без комментариев).
Или, может, лучше бильярд (с приличной графикой)? 1330 строк кода.
В веб приложениях эти 10% императивного кода заменяет браузер.
Есть приложения для обработки потоков данных.
Есть приложения типа Ejabberd (написан на erlang).
А для дестопных ГУИ приложений есть реактивный интерфейс. Правда, лично я с десктопными приложениями не знаком. Не могу сказать, насколько это удобно по сравнению с ООП ГУИ интерфейсом.
Нехватка специалистов. Особенно с опытом реализации масштабных проектов.
Нежелание начинать проект на незнакомом языке (сложно оценить сроки и т.д.).
Большинство программистов занимается развитием/поддержкой старых проектов. Проектов, которые сейчас начинаются с чистого листа, мало.
Есть много причин, и они не имеют никакого отношения к функциональным языкам.
Предлагаю сравнить PHP и F#.
The world's 100 most threatened species
На этой странице есть таблица с одноимённым названием. Нужно выбрать из таблицы всех черепаховых (название типа содержит "turtle") и вывести в консоль.
Сколько строк займёт программа на PHP? Использование сторонних (популярных) библиотек для сокращения кода - приветствуется.
Очередное необоснованное утверждение.
Я говорю о популярности. Ещё до wasm появились трансляторы из других языков (включая функциональные) в JavaScript. То есть, сейчас возможно написать сайт целиком, например, на F#. Но большинство, по-прежнему, разрабатывает клиентскую часть на JavaScript.
Может и из синтаксиса, но чаще - по другим причинам. Поэтому неправильно сравнивать удобство синтаксиса по популярности.
Например, я не знаю ни одного преимущества C# над F#, кроме "его знает больше народу".
Видели. Включая случаи, когда для серьёзного проекта проводили исследования по применимости различных языков и в итоге выбирали функциональный.
Я уже писал. Для ФП языков мало вакансий, так как мало проектов. Мало проектов, так как мало специалистов. Мало специалистов, так как мало вакансий.
Это неверно ни для функциональных языков в целом, ни для лиспа в частности.
Отладчики существуют. Или Вы что-то другое имеете ввиду?
Прямо перед этим речь идёт об автомобилях. Причём, в контексте, что более качественные автомобили менее доступны и, как следствие, менее популярны.
Вот - "менее доступный". А Вы из этого делаете вывод "вообще не годится".
Вы написали, что из двух описанных мной молотков лучше тот, которым забивают больше гвоздей. Значит, глядя на молотки, Вы не можете определить, какой из них лучше.
Обоснуйте Ваш тезис, что ФП подходит только для программирования ряда Фибоначчи. Нужность рядом Фибоначчи для данной дискуссии не имеет значения.
Уточню мои рассуждения. Предположим, что качество можно измерять популярностью (как Вы предлагаете). Когда-то Лисп был более распространён, чем Си. Следовательно, в тот момент Лисп был лучше, чем Си. Позже Си стал лучше, чем Лисп. При этом синтаксис этих языков не поменялся. Приходим к противоречию (Лисп лучше, чем Си, а Си лучше, чем Лисп)..
Выбор языка для проекта определяется несколькими факторами. Наиболее важные из них:
Наличие транслятора для целевой платформы
Например, браузерную игру никто не будет писать на Си, так как нет транслятора, переводящего код Си в инструкции, которые могут исполнять популярные браузеры
Наличие подходящего готового кода
Под готовым кодом подразумеваются не только библиотеки, фреймворки, движки (например, для игр), но и предыдущие версии продукта.
Наличие специалистов
Как видим, в список наиболее важных факторов синтаксис языка не входит. Поэтому популярность языка не пропорциональна качеству/удобству его синтаксиса.
То есть, Вы не можете взять два разных молотка и определить, какой из них лучше/удобнее для забивания гвоздей? Значит, Вы оцениваете не качество инструмента, а что-то другое.
Вы ошибаетесь. Ничего такого мне не хочется.
Обоснуйте. (Аргумент "весь мир" не состоятелен).
Когда-то Лисп был более распространён, чем Си. Когда-то предпочитали лошадь трактору. Выбор инструмента определяется множеством факторов, а не тем, какой лучше.
У меня есть два молотка. Один - старый с деревянной ручкой, который достался от дедушки. Второй - новый, современный (с прорезиненной рукоятью и т.д.). Какой из них лучше?
Для меня очевидно, что второй лучше и удобней. Для Вас лучше тот, которым я забиваю гвозди.
100% опрошенных мной детей в возрасте 13 лет сказали, что Хаскель проще для понимания, чем Питон. Что на Хаскель проще писать программы. (Всего был опрошен один ребёнок :) ).
Питон кажется более простым для тех, кому успели "сломать мозг" циклами и прочей императивщиной. Очевидно, что декларативный SQL для поиска данных удобней (выразительней) императивного Си.
Данный код демонстрирует преимущества декларативного подхода над императивным :).
Вместо того, чтобы элементы в ДОМе перебирать, задали CSS-селектор.
Вместо того, чтобы символы в цикле переставлять, задали нужный стиль.
Удобней (наглядней, выразительней) сказать, что нужно сделать, а не описывать, как.
Если человек даже строку развернуть не может, то как он будет добиваться решения сложных производственных задач?
Это не показатель. Выбор языка для проекта зависит от многих факторов.
John Hughes, Why Functional Programming Matters (статья на английском)
Откуда у Вас такая информация?
Не надо это знать. Нужно быть способным придумать этот алгоритм прямо во время собеседования.
На чём основано такое мнение?
Неверное предположение, что большинство пользуется тем, что лучше. Тем более, программисты не свободны в выборе языка.
Да и сама оценка "лучше" требует указания критериев. Для меня критерием является качество получаемого кода.