"Функциональное программирование" имеет четкое значение, но "функциональный язык"?
Я очень четко понимаю разницу между функциональными и императивными методами программирования. Но там широко распространена тенденция говорить о "функциональных языках", и это меня действительно смущает.
Конечно, некоторые языки, такие как Haskell, более гостеприимны для функционального программирования, чем другие языки, такие как C. Но даже первые делают I/O (он просто держит его в гетто). И вы можете писать функциональные программы на C (это просто абсурдно сложнее). Так что, возможно, это только вопрос степени.
Тем не менее, даже в какой-то степени, что это значит, когда кто-то называет Scheme "функциональным языком"? Большинство кода схемы, которые я вижу, являются обязательными. Это просто, что Scheme упрощает запись в функциональном стиле, если вы хотите? Так же делают Lua и Python. Являются ли они "функциональными языками"?
Я (действительно) не пытаюсь быть языковым полицейским. Если это просто свободный способ поговорить, это прекрасно. Я просто пытаюсь выяснить, имеет ли он определенное значение (даже если это значение степени важности), которое я не вижу.
Ответы
Ответ 1
Среди людей, изучающих языки программирования для жизни, "язык функционального программирования" - довольно слабо связанный термин. Существует единодушное мнение, что:
- Любой язык, который называет себя функциональным, должен поддерживать first-class, вложенные функции с лексическими правилами определения области.
Значительное меньшинство также резервирует термин "функциональный язык" для языков, которые:
как в таких языках, как Agda, Clean, Coq и Haskell.
Кроме того, то, что считается функциональным языком программирования, часто является вопросом намерения, то есть, хотят ли дизайнеры, чтобы он назывался "функциональным".
Perl и Smalltalk являются примерами языков, поддерживающих первоклассные функции, но дизайнеры которых не называют их функциональными. Objective Caml - это пример языка, который называется функциональным, хотя он имеет полную объектную систему с наследованием и всем.
Языки, которые называются "функциональными", будут иметь такие функции, как следующие (взятые из Определение точки функционального программирования):
Чем более конкретный язык программирования имеет синтаксис и конструкции, адаптированные к тому, чтобы упростить/безболезненно выразить различные функции программирования, перечисленные выше, тем более вероятно, что кто-то назовет его "функциональным языком".
Ответ 2
Я бы сказал, что функциональный язык - это любой язык, который позволяет функциональное программирование без чрезмерной боли.
Ответ 3
Мне нравится @Randolpho ответ. Что касается особенностей, я могу привести список здесь:
Определение точки функционального программирования
а именно
- Чистота (a.k.a. неизменяемость, исключающие побочные эффекты, ссылочная прозрачность)
- Функции более высокого порядка (например, передайте функцию как параметр, верните ее в результате, определите анонимную функцию "на лету" как выражение лямбда)
- Лень (a.k.a. нестрогая оценка, наиболее полезная/полезная при сочетании с чистотой)
- Алгебраические типы данных и соответствие шаблону
- Затворы
- Currying/ частичное приложение
- Параметрический полиморфизм (a.k.a. generics)
- Рекурсия (более заметная в результате чистоты)
- Программирование с выражениями, а не с утверждениями (опять же, из чистоты)
Чем более конкретный язык программирования имеет синтаксис и конструкции, адаптированные к тому, чтобы различные функции FP, перечисленные выше, легко или безболезненно выразить и реализовать, тем более вероятно, что кто-то назовет его "функциональным языком".
Ответ 4
Джейн Стрит Брайан Херт написал очень хорошую статью об этом некоторое время назад. Базовое определение, к которому он пришел, состоит в том, что язык функционального программирования является языком, который моделирует лямбда-исчисление. Подумайте о том, какие языки широко признаны функциональными, и вы увидите, что это очень практичное определение.
Lisp была примитивной попыткой моделировать лямбда-исчисление, поэтому она соответствует этому определению, хотя, поскольку большинство реализаций не очень тесно связаны с идеями лямбда-исчисления, их обычно считают смешанной парадигмой или в лучшем случае слабо функциональный.
Именно поэтому многие люди щетинивают языки, такие как Python, называемые функциональными. Общая философия Питона не связана с лямбда-исчислением - она не поощряет этот способ мышления вообще - так это не функциональный язык. Это машина Тьюринга с первоклассными функциями. Вы можете выполнять программирование функционального стиля в Python, да, но язык не имеет своих корней в той же математике, что и в функциональных языках. (Кстати, сам Guido van Rossum согласен с этим описанием языка.)
Ответ 5
Язык (и платформа), который продвигает функциональное программирование как средство полного использования возможностей этой платформы.
Ответ 6
Язык, который делает намного сложнее создавать функции с побочными эффектами, чем без побочных эффектов. То же самое относится к изменяемым/неизменяемым структурам данных.
Ответ 7
Вы можете выполнять программирование функционального стиля на любом языке. Я стараюсь как можно больше.
Python, Linq все поддерживают программирование функционального стиля.
A чистый функциональный язык, такой как Haskell, требует выполнения всех ваших вычислений с использованием математических функций, функций, которые ничего не меняют, они просто возвращают значения.
Кроме того, функциональные языки обычно позволяют писать функции более высокого порядка, функции, которые принимают функции как аргументы и/или возвращаемые типы.
Ответ 8
Я думаю, что один и тот же вопрос можно задать по поводу "языков ООП". В конце концов, вы можете писать объектно-ориентированные программы в C (и это не редкость для этого). Но C не имеет встроенных языковых конструкций для включения ООП. Вы должны делать ООП "вручную" без большой помощи от компилятора. Вот почему он обычно не считается языком ООП. Я думаю, что это различие может быть применено и к "функциональным языкам": например, не редко можно написать функциональный код в С++ (подумайте о функциях STL, таких как std::count_if
или std::transform
). Но на С++ (на данный момент) отсутствуют встроенные языковые функции, которые обеспечивают функциональное программирование, например lambdas. (Пусть игнорируется boost:: lambda ради аргумента.)
Итак, чтобы ответить на ваш вопрос, я бы сказал, хотя можно писать функциональные программы на каждом из этих языков:
- C не является функциональным языком (нет встроенных конструктов функционального языка)
- Схема, Python и друзья имеют функциональные конструкции, поэтому они являются функциональными языками. Но у них также есть императивные и ООП-конструкции, поэтому их обычно называют "мультипарадигмами".
Ответ 9
Haskell для одного имеет разные типы функций с побочными эффектами и без него.
Это довольно хорошее распознающее свойство для 100% функционального языка, по крайней мере ИМХО.
Ответ 10
Я однажды написал (довольно длинный) анализ о том, почему термин "язык функционального программирования" бессмыслен, что также пытается объяснить, почему, например, "функции" в Haskell полностью отличаются от "функций" в Lisp или Python: http://blog.nihilarchitect.net/archives/289/on-functional-programming/
Такие вещи, как "map" или "filter", для большей части также реализуемы в C, например.