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

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

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

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

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

29
задан dubiousjim 18 February 2010 в 19:54
поделиться

10 ответов

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

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

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

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

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

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

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

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

16
ответ дан 28 November 2019 в 01:45
поделиться

У меня смешанные чувства. Я мастер в SQL только потому, что это так легко проверить. Можно быстро протестировать инструкции SELECT до тех пор, пока не будут получены правильные результаты. А к рефактору - это рывок.

В Doctorine, или любом ORM, существует так много уровней абстракции, что почти кажется ОКР (навязчивый/компульсивный). В моем последнем проекте, в котором я опробовал «Доктрину», я ударился о несколько стен. Мне потребовалось несколько дней, чтобы найти решение для того, что я знал, что мог бы написать в SQL за считанные минуты. Это расстраивает.

Я сварлив. Сообщество для SQL ОГРОМНО. Сообщество/поддержка доктрины мизерны. Уверен, что вы можете посмотреть на источник и попытаться выяснить это... и эти проблемы требуют нескольких дней, чтобы разобраться.

Итог: не пробуйте Доктрину, или какую-либо ОРМ, не планируя в течение длительного времени самостоятельно производить продукты.

-121--1468554-

Ошибка Python.

См. http://eric.lubow.org/2009/python/pythons-mysqldb-2014-error-commands-out-of-sync/

Похоже, возникла проблема с запросом MySQLdb.

-121--3612684-

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

12
ответ дан 28 November 2019 в 01:45
поделиться

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

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

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

.
4
ответ дан 28 November 2019 в 01:45
поделиться

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

1
ответ дан 28 November 2019 в 01:45
поделиться

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

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

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

В Haskell есть разные типы функций с побочными эффектами и без них.

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

0
ответ дан 28 November 2019 в 01:45
поделиться

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

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

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

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

0
ответ дан 28 November 2019 в 01:45
поделиться

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

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

а именно

  • Чистота (она же неизменяемость, отказ от побочных эффектов, ссылочная прозрачность)
  • Функции высшего порядка (напр. например, передать функцию в качестве параметра, вернуть ее как результат, определить анонимную функцию на лету как лямбда-выражение)
  • Лень (a.k.a.. нестрогая оценка, наиболее полезна/полезна в сочетании с чистотой)
  • Алгебраические типы данных и согласование шаблонов
  • Закрытия
  • Керринг / частичное применение
  • Параметрический полиморфизм (он же. дженерики)
  • Рекурсия (более заметная в результате чистоты)
  • Программирование с помощью выражений, а не утверждений (опять же, в результате чистоты)

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

9
ответ дан 28 November 2019 в 01:45
поделиться

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

2
ответ дан 28 November 2019 в 01:45
поделиться

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

Такие вещи, как 'map' или 'filter', по большей части также могут быть реализованы, например, в C.

0
ответ дан 28 November 2019 в 01:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: