Подтвердить что ты не робот

"Функциональное программирование" имеет четкое значение, но "функциональный язык"?

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

Конечно, некоторые языки, такие как Haskell, более гостеприимны для функционального программирования, чем другие языки, такие как C. Но даже первые делают I/O (он просто держит его в гетто). И вы можете писать функциональные программы на C (это просто абсурдно сложнее). Так что, возможно, это только вопрос степени.

Тем не менее, даже в какой-то степени, что это значит, когда кто-то называет Scheme "функциональным языком"? Большинство кода схемы, которые я вижу, являются обязательными. Это просто, что Scheme упрощает запись в функциональном стиле, если вы хотите? Так же делают Lua и Python. Являются ли они "функциональными языками"?

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

4b9b3361

Ответ 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, например.