8

Одной из основных характеристик функционального программирования является использование побочных эффектов. Однако это можно сделать и на императивном языке. То же самое верно для рекурсии и лямбда-функций (например, C++ 0x). Поэтому я задаюсь вопросом, являются ли императивные языки программирования супермножеством функциональных.Является ли функциональное программирование подмножеством императивного программирования?

+1

Интересный вопрос ...в императивном программировании у вас есть больше способов «повесить себя», я верю :-) – jldupont

+0

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

ответ

9

Вообще говоря, нет; функциональное программирование - это подмножество декларативного программирования (в которое входят логические языки программирования, такие как Prolog). Многие императивные языки заимствуют элементы из функциональных языков программирования, но просто наличие lambdas или ссылочно-прозрачных функций не делает императивный язык функциональным; функциональное программирование - это нечто большее, чем просто эти элементы.

+1

Действительно? Я написал программы в Prolog, а некоторые из них связаны с SQL-материалами, и я написал чисто функциональные программы. Эти двое не казались мне похожими. –

+1

Они похожи в том смысле, что вы говорите компьютеру * что * делать (то есть выражать логику вычислений), а не * как * делать это; это определение декларативного программирования. – mipadi

+0

Чисто функциональные языки, но как нечисто функциональные языки снова перекрываются, а не являются надлежащим подмножеством. – Zorf

4

Возможно реализовать определенную парадигму программирования на языке, который не поддерживает парадигму программирования изначально. Например, его можно написать объектно-ориентированный код в C, пока он не предназначен для этой цели.

Функциональное программирование - это хорошо разработанная парадигма программирования, и его лучше всего изучать на таких языках, как Haskell, LISP и т. Д. И после того, как вы их хорошо изучили, даже если вы не используете эти языки регулярно, вы можете начать использовать эти принципы в повседневном языке вы используете на регулярной основе.

Некоторые люди любят Google для Object oriented programming in C

+1

Что вы сказали о C, не имеет смысла, кроме как в самом тривиальном, что вы можете иметь «объект». В чем смысл ООП без полиморфизма и наследования? – user44242

+2

вы можете реализовать свои собственные vtables в c, если хотите –

+0

В C можно, конечно, написать объектно-ориентированный код; мы сделали это в проекте еще в конце 80-х, работая над OS/2, где не было языков OO. Для реализации полиморфизма и наследования требовался большой (и немного безумный) набор макросов, но он работал. –

20

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

+0

Так правда ... Мне жаль, что у меня не было +1. – jldupont

+0

Стивен Вольфрам сказал бы «способный к универсальным вычислениям» или что-то вроде этого. – jldupont

4

Парадигма - это способ делать вещи, и есть две основные парадигмы программирования: императивная и декларативная. Тот факт, что некоторые языки позволяют смешивать обе парадигмы, не означает, что один из них включен в другой, но что Языки являются multi-paradigm.

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

+0

Lisp (Common Lisp, в частности) обычно называют языком мультипарадигмы. С относительной легкостью вы можете написать императив, а также функциональный код. – Vatine

+1

Lisp называется мультипарадигмой точно так же, как C++. Пуристы скажут, что они - парадигма (и они правы), но в общем использовании они обычно называются функциональными и императивными/объектно-ориентированными соответственно. Во всяком случае, я хотел сказать, что если вы можете сделать обе парадигмы, язык _is_ multi парадигма, поэтому вопрос о op был ошибочно изложен с самого начала. – fortran

2

Большинство императивных языков не имеют функций типа первого порядка, тогда как большинство функционалов o. (Как и C++, через boost :: function.)

По типу первого порядка это измерить значение/переменную может быть любого типа, int, bool, функции из int-> bool. Он обычно также включает замыкания или связанные значения, где у вас есть одна и та же функция, но некоторые аргументы уже заполнены.

Эти два являются тем, что функциональное программирование в основном связано с ИМХО.

1

шаблон отображения как

f:: [int] -> int 
f [] = 0 
f (x:xs) = 1 + f(xs) 

является то, что, например, одна вещь, которая не доступна на императивных языках. конструкция также как кэрри функция:

add2 :: int -> int 
add2 = (2 +) 

не доступен в большинстве императивных языках

+0

Каррирование может быть выполнено на C++ с использованием шаблонов: http://stackoverflow.com/questions/152005/how-can-currying-be-done-in-c –

2

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

Для меня парадигм представляют «способы мышления» (понятий и абстракцию, такие как функции, объекты, рекурсия), тогда как языков предлагают «способы ведения» (синтаксис, переменные, оценка) ,

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

Интересно, насколько сложно выполнить определенные задачи на определенных языках или парадигмах, насколько подходит инструмент для этой задачи. Даже игра Жизни Конвея - Тьюринга - полная, но это не заставляет меня хотеть программировать с ней.

Многие языки поддерживают ряд парадигм. C++ был разработан как объектно-ориентированное расширение для C, но в нем можно написать чисто процедурный код.

Некоторые языки занимают или приобретают функции с других языков или парадигмы с течением времени (просто посмотрите на эволюцию Java).

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

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

+0

«Не имеет значения, какое из условий является подмножеством что: «Одна из причин, почему я спросил об этом, - это то, что мне нравятся некоторые концепции функционального программирования, но мне не нравятся его ограничения, такие как, как известно, сложный способ работы с I/O и широкое использование рекурсии , –

+0

С каких это рекурсивных ограничений? Петли и рекурсия - это две стороны одной и той же монеты, но одна из них часто более уместна, чем другая. Функциональное программирование - это парадигма, специфический язык (его синтаксис и его библиотеки) определяет «насколько сложно» это такие вещи, как ввод-вывод или цикл. Ваше использование слова «пресловутый» предполагает, что вы не очень хорошо себя чувствовали. Пожалуйста, сделайте - я обнаружил, что I/O довольно «трудно» понять в Java 2, но я использовал только Javadocs, чтобы понять это. Выберите язык, который кажется вам «дружелюбным», и начните читать об этом. – Galghamon

1

Один из способов взглянуть на него (не сказать, что это правильный путь, потому что я не дизайнер или теоретик) ни в коем случае не является то, что , если язык по существу преобразован в нечто другое, то что-то другое 'должно быть надмножеством источника. Поэтому байт-код обязательно является надмножеством Java. .NET IL - это надмножество C# и F #. Функциональные конструкции в C# (то есть LINQ) являются, таким образом, подмножеством императивных конструкций IL.

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

+0

+1 Хорошее замечание! Я бы хотел поддержать, но это не сработает («проголосовать слишком стары, чтобы меняться»). Извини :( –

Смежные вопросы