Подтвердить что ты не робот

Почему С# - функциональный язык программирования?

Было сказано, что С# можно рассматривать как язык функционального программирования, хотя он широко известен как язык программирования OO.

Итак, какой набор функций делает С# функциональным языком программирования?

Я могу только подумать:

  • делегаты (даже без анонимных методов и лямбда-выражений)
  • закрытие

Что-нибудь еще?

4b9b3361

Ответ 1

С# заимствовал множество функций от ML и Haskell, например:

  • С# 2.0 привел нам параметрический полиморфизм (или "generics" ). Я слышал, что Dom Syme, один из создателей F #, в значительной степени отвечал за реализацию generics в .NET BCL.

  • С# 2.0 также позволяет программистам передавать и возвращать функции в качестве значений для функций более высокого порядка и имеет ограниченную поддержку анонимных делегатов.

  • С# 3.0 и 3.5 улучшают поддержку анонимных функций для истинных закрытий.

  • LINQ можно рассматривать как собственный вкус понимания списков в С#.

  • Анонимные типы выглядят как аппроксимация записей ML

  • Тип-вывод задан.

  • Я не знаю о вас, но С# методы расширения выглядят очень много, как Haskell типы классов.

  • Было много разговоров о "динамическом" ключевом слове в С# 4.0. Я не на 100% уверен в деталях его реализации, но я уверен, что он будет использовать структурную типизацию, а не позднюю привязку, чтобы сохранить С# время компиляции. Структурная типизация примерно эквивалентна "утиному набору для статических языков", ее особенность, которую хакельские и ML-хакеры наслаждались годами.

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

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

Ответ 2

Не существует строгого определения "Язык OO", "Функциональный язык", "Процессуальный язык", можно аргументировать, что любой язык подходит в основном для любой классификации; можно написать процедурные Java, объектно-ориентированные C и функциональные С++. Обычно я использую классификацию, основанную на том, что поддерживает основные семантические функции, а также общая практика развития. Хороший способ взглянуть на это - изучить встроенные и популярные фреймворки и посмотреть, какой стиль они используют.

Функциональные языки в основном определяются как функции с примитивами первого класса, со стилями разработки, которые используют их для уменьшения сложности с помощью идиом типа "карта". Еще одна общая особенность - сопоставление шаблонов, но я не считаю это исключительно функциональным. "Чистые" функциональные языки также не имеют побочных эффектов, но это не обязательно (см., Как нечеткие эти понятия?).

Итак, что С#? Ну, у него есть примитивы стиля первого класса, с делегатами (и получил более синтаксическую поддержку стиля с анонимными делегатами и лямбдами). Это делает его функциональным? Возможно, если писать в функциональном стиле. Использует ли Framework этот стиль? Нет, не совсем.

Как таковой, я бы не считал класс С# функциональным в общем обсуждении - это, в лучшем случае, мультипарадигма с некоторым функциональным вкусом.

Ответ 3

Ну, делегаты и блокировки позволяют ему работать в основном функционально... например:

var sum = data.Sum(x=>x.SomeProp);

и т.д.

Вы можете написать большинство функций более высокого порядка, используя lambdas/delegates. Вывод типа не совсем такой же, как чистые функциональные языки, такие как F #, но С# generic-type-inference все еще довольно хорош (особенно в С# 3.0).

Это особенно верно в .NET 3.5 и С# 3.0, где LINQ использует высокофункциональный подход ко многим из проблем. Но вы все еще можете использовать функциональные аспекты С# с .NET 2.0 и С# 2.0. Это проще с С# 3.0 и lambdas; -p

Собственно, С# является прагматичным языком программирования. Он направлен на то, чтобы дать возможность использовать ряд парадигм, не нападая на вас ужасно, если вы хотите сделать что-то другое.

Ответ 4

Указатели функций - это еще одна функция, которая имеет С# в функциональной категории.

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

От Функциональное программирование:

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

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

Ответ 5

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

Ответ 7

С# имеет некоторые функции функционального языка, например, замыкания. Библиотеки .NET не написаны в функциональном стиле, поэтому на практике С# не является функциональным языком. Почти все происходит с мутацией. Типы коллекции все изменяемы.

Ответ 8

Это основные моменты, которые дают С# 1-Lamba expresions 2-Расширение 3-Type inferende 4-Инициализаторы объектов и коллекций 5-Затворы 6-анонимных типов 7-Linq