«Функциональное программирование» имеет четкое значение, но имеет ли «функциональный язык»? - PullRequest
29 голосов
/ 18 февраля 2010

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

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

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

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

Ответы [ 10 ]

16 голосов
/ 19 февраля 2010

Среди людей, которые изучают языки программирования для жизни, «функциональный язык программирования» - довольно слабый термин. Существует твердое мнение, что:

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

Значительное меньшинство также резервирует термин "функциональный язык" для языков, которые:

как в таких языках, как Agda, Clean, Coq и Haskell.

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

Perl и Smalltalk - примеры языков, которые поддерживают первоклассные функции, но разработчики которых не называют их функциональными. Objective Caml является примером языка, который называется функциональным, даже если он имеет полную объектную систему с наследованием и всем прочим.

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

Чем больше конкретный язык программирования имеет синтаксис и конструкции, приспособленные для того, чтобы сделать перечисленные выше функции программирования простыми / безболезненными для выражения и реализации, тем больше вероятность, что кто-то назовет его «функциональным языком».

12 голосов
/ 18 февраля 2010

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

9 голосов
/ 19 февраля 2010

Мне нравится ответ @ Randolpho.Что касается функций, я мог бы привести этот список здесь:

Определение точки функционального программирования

, а именно

  • Чистота (он же неизменность , исключение побочных эффектов, ссылочная прозрачность )
  • функции высшего порядка (например, передать функцию в качестве параметра, верните его в результате, определите анонимную функцию на лету как лямбда-выражение)
  • Laziness (иначе не строгая оценка , наиболее полезная / пригодная для использования в сочетаниис чистотой)
  • алгебраические типы данных и сопоставление с образцом
  • замыкания
  • каррирование / частичное применение
  • Параметрический полиморфизм (он же универсальный )
  • рекурсия (более заметен в результате чистоты)
  • Программирование с помощью выражений, а не утверждений (опять же, из чистоты)

Чем больше частьКлассический язык программирования имеет синтаксис и конструкции, специально разработанные для того, чтобы сделать перечисленные выше функции ПП простыми / безболезненными для выражения и реализации, и, скорее всего, кто-то назовет его «функциональным языком».

4 голосов
/ 18 февраля 2010

Брайан Херт из Jane Street написал очень хорошую статью об этом некоторое время назад. Основное определение, к которому он пришел, состоит в том, что функциональный язык программирования - это язык, который моделирует лямбда-исчисление . Подумайте о том, какие языки широко признаны функциональными, и вы увидите, что это очень практичное определение.

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

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

2 голосов
/ 18 февраля 2010

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

1 голос
/ 18 февраля 2010

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

0 голосов
/ 20 мая 2010

Я однажды написал (довольно длинный) анализ того, почему термин «функциональный язык программирования» не имеет смысла, и также пытается объяснить, почему, например, «функции» в Haskell полностью отличаются от «функций» в Lisp или Python: http://blog.nihilarchitect.net/archives/289/on-functional-programming/

Такие вещи, как «карта» или «фильтр», по большей части также могут быть реализованы, например, в Си.

0 голосов
/ 19 февраля 2010

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

Это довольно хорошее свойство различения для того, чтобы быть на 100% функциональным языком, по крайней мере, ИМХО.

0 голосов
/ 18 февраля 2010

Я думаю, что тот же вопрос можно задать о "языках ООП". В конце концов, вы можете писать объектно-ориентированные программы на C (и это не редкость). Но в C нет встроенных языковых конструкций для включения ООП. Вы должны делать ООП "вручную" без особой помощи от компилятора. Вот почему это обычно не считается языком ООП. Я думаю, что это различие можно применить и к «функциональным языкам»: например, нередко писать функциональный код на C ++ (подумайте о функциях STL, таких как std::count_if или std::transform). Но в C ++ (на данный момент) отсутствуют встроенные функции языка, которые обеспечивают функциональное программирование, например лямбда-выражения. (Давайте проигнорируем boost :: lambda ради аргумента.)

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

  • C не является функциональным языком (без встроенных функциональных языковых конструкций)
  • Scheme, Python и друзья имеют функциональные конструкции, поэтому они являются функциональными языками. Но они также имеют императивные и ООП-конструкции, поэтому их обычно называют «мультипарадигмыми» языками.
0 голосов
/ 18 февраля 2010

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

Python, Linq все продвигают функциональный стиль программирования.

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

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

...