Является ли функциональное программирование подмножеством императивного программирования?

StackOverflow https://stackoverflow.com/questions/1783352

Вопрос

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

Некоторым людям может понравиться Google для Объектно -ориентированное программирование в C

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

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

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

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

Мне, парадигмы представлять "Способ мышления" (Концепции и абстракции, такие как функции, объекты, рекурсия), тогда как языки предложение "Способы делать" (Синтаксис, переменные, оценки).

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

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

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

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

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

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

Один из способов взглянуть на это (не говоря уже о том, что я не являюсь дизайнером или теоретиком LANG. если Язык, по сути, преобразуется во что -то другое, чем «что -то другое» должно быть суперсетом источника. Таким образом, байт -код обязательно является суперсетом Java. .NET IL - это суперсет C# и F#. Таким образом, функциональные конструкции в C# (IE LINQ) являются подмножеством императивных конструкций IL.

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

Картирование рисунков как

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top