Я понимаю очень ясно различие между методами функционального и императивного программирования. Но существует широко распространенная тенденция говорить "о функциональных языках", и это действительно смущает меня.
Конечно, некоторые языки как Haskell более гостеприимны к функциональному программированию, чем другие языки как C. Но даже первый делает ввод-вывод (это просто сохраняет его в гетто). И можно записать функциональные программы в C (это просто нелепо более твердо). Таким образом, возможно, это - просто вопрос градуса.
Однако, как раз когда вопрос градуса, что означает то, когда кто-то называет Схему "функциональным языком"? Большая часть кода Схемы, который я вижу, обязательна. Это просто, что Схема помогает записать в функциональном стиле, если Вы хотите? Так также сделайте Lua и Python. Они - "функциональные языки" также?
Я (действительно) не пытаюсь быть полицейским языка. Если это - просто свободный способ говорить, это прекрасно. Я просто пытаюсь выяснить, имеет ли это действительно некоторое определенное значение (даже если это - вопрос градуса, означающий), что я не вижу.
Среди людей, которые зарабатывают на жизнь изучением языков программирования, "функциональный язык программирования" - довольно слабо связанный термин. Существует устойчивое мнение, что:
Значительное меньшинство также сохраняет термин "функциональный язык" для языков, которые являются:
как в таких языках, как Agda, Clean, Coq и Haskell.
Помимо этого, то, что считается функциональным языком программирования, часто является вопросом намерения, то есть, хотят ли разработчики называть его "функциональным".
Perl и Smalltalk - примеры языков, которые поддерживают функции первого класса, но разработчики которых не называют их функциональными. Objective Caml - пример языка, который называют функциональным, хотя в нем есть полная объектная система с наследованием и все такое.
Языки, которые называются "функциональными", как правило имеют следующие особенности (взято из Определяющей точки функционального программирования):
Чем больше конкретный язык программирования имеет синтаксис и конструкции, приспособленные для того, чтобы различные функции программирования, перечисленные выше, было легко/безболезненно выразить и реализовать, тем больше вероятность того, что кто-то назовет его "функциональным языком".
У меня смешанные чувства. Я мастер в 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-Я бы сказал, что функциональный язык - это любой язык, который позволяет функциональное программирование без лишней боли.
Брайан Херт из Jane Street написал очень хорошую статью об этом некоторое время назад. Основное определение, к которому он пришел, гласит, что функциональный язык программирования - это язык, который моделирует лямбда-исчисление. Подумайте о том, какие языки, по общему мнению, являются функциональными, и вы увидите, что это очень практичное определение.
Лисп был примитивной попыткой моделирования лямбда-исчисления, поэтому он подходит под это определение - хотя, поскольку большинство реализаций не очень точно придерживаются идей лямбда-исчисления, их принято считать смешанной парадигмой или, в лучшем случае, слабофункциональными.
Это также является причиной того, что многие люди возмущаются тем, что такие языки, как Python, называют функциональными. Общая философия Python не связана с лямбда-исчислением - она вообще не поощряет такой способ мышления - поэтому это не функциональный язык. Это машина Тьюринга с первоклассными функциями. Да, в Python можно программировать в функциональном стиле, но этот язык не имеет корней в той же математике, что и функциональные языки. (Кстати, сам Гвидо ван Россум согласен с таким описанием языка)
.Язык, который значительно усложняет создание функций с побочными эффектами, чем без побочных эффектов. То же самое и с изменяемыми / неизменяемыми структурами данных.
Думаю, тот же вопрос можно задать о «языках ООП». В конце концов, вы можете писать объектно-ориентированные программы на C (и это не редкость). Но в C нет встроенных языковых конструкций для включения ООП. Вы должны выполнять ООП «вручную» без особой помощи со стороны компилятора. Вот почему он обычно не считается языком ООП. Я думаю, что это различие можно применить и к «функциональным языкам»: например, нередко писать функциональный код на C ++ (подумайте о функциях STL, таких как std :: count_if
или std :: преобразование
). Но в C ++ (на данный момент) отсутствуют встроенные языковые функции, обеспечивающие функциональное программирование, например лямбды. (Давайте проигнорируем boost :: lambda ради аргумента.)
Итак, чтобы ответить на ваш вопрос, я бы сказал, что хотя можно писать программы-функции на каждом из этих языков:
В Haskell есть разные типы функций с побочными эффектами и без них.
Это довольно хорошее отличительное свойство для 100% функционального языка, по крайней мере, IMHO.
Вы можете заниматься программированием в функциональном стиле на любом языке. Я стараюсь как можно больше.
Python, Linq - все они поддерживают функциональный стиль программирования.
Такой чистый функциональный язык, как Haskell, требует, чтобы вы выполняли все вычисления с помощью математических функций, функций, которые ничего не изменяют, они просто возвращают значения.
Кроме того, функциональные языки обычно позволяют писать функции более высокого порядка, функции, которые принимают функции в качестве аргументов и/или возвращаемых типов.
Мне нравится ответ @Randolpho. Что касается особенностей, я мог бы привести список здесь:
Определяющий момент функционального программирования
а именно
Чем больше конкретный язык программирования имеет синтаксис и конструкции, приспособленные для того, чтобы различные перечисленные выше возможности ФП было легко/безболезненно выразить и реализовать, тем больше вероятность того, что кто-то назовет его "функциональным языком".
Язык (и платформа), который продвигает функциональное программирование как средство полного использования возможностей указанной платформы.
Я однажды написал (довольно длинный) анализ того, почему термин «язык функционального программирования» бессмысленен, что также пытается объяснить, почему, например, «функции» в Haskell полностью отличаются от «функций» в Lisp или Python: http://blog.nihilarchitect.net/archives/289/on -functional-programming /
Такие вещи, как 'map' или 'filter', по большей части также могут быть реализованы, например, в C.