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

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

я не знаю C# вообще, и я не знаю, может ли он связаться с C, но здесь его реализация в C.

8
задан Dimitri C. 23 November 2009 в 14:13
поделиться

8 ответов

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

9
ответ дан 5 December 2019 в 04:41
поделиться

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

20
ответ дан 5 December 2019 в 04:41
поделиться

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

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

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

2
ответ дан 5 December 2019 в 04:41
поделиться

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

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

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

4
ответ дан 5 December 2019 в 04:41
поделиться

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

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

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

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

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

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

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

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

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

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

2
ответ дан 5 December 2019 в 04:41
поделиться

Отображение шаблонов, например

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

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

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

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

1
ответ дан 5 December 2019 в 04:41
поделиться

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

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

4
ответ дан 5 December 2019 в 04:41
поделиться

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

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

2
ответ дан 5 December 2019 в 04:41
поделиться
Другие вопросы по тегам:

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