Почему C # является функциональным языком программирования? - PullRequest
32 голосов
/ 26 декабря 2008

Говорят, что C # можно рассматривать как функциональный язык программирования, хотя он широко признан как язык программирования ОО.

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

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

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

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

Ответы [ 8 ]

42 голосов
/ 26 декабря 2008

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

  • C # 2.0 принес нам параметрический полиморфизм (или «дженерики»). Я слышал, что Дом Сайм, один из создателей F #, в основном отвечал за реализацию обобщений в .NET BCL.

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

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

  • LINQ можно рассматривать как собственную разновидность C # понимания списков.

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

  • Тип-логика дана.

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

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

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

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

37 голосов
/ 26 декабря 2008

Поскольку не существует строгого определения «OO Language», «Functional Language», «Procedural Language», можно приводить аргументы в пользу того, что любой язык подходит в основном для любой классификации; Можно написать процедурную Java, объектно-ориентированный C и функциональный C ++. Обычно я использую классификацию, основанную на том, что поддерживают основные семантические функции, наряду с обычной практикой разработки. Хороший способ взглянуть на это - изучить встроенные и популярные фреймворки и посмотреть, какой стиль они используют.

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

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

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

9 голосов
/ 26 декабря 2008

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

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

и т.д.

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

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

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

6 голосов
/ 26 декабря 2008

Функциональные указатели - это еще одна функция, имеющаяся в C # в функциональной категории.

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

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

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

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

3 голосов
/ 26 декабря 2008

Вы можете найти отличный обзор языковых возможностей в презентации Эндрю Кеннеди (из MS Research) под названием C # - это функциональный язык программирования . Моя статья о функциональном программировании на C # и F # дает обзор с точки зрения более высокого уровня (особенно ближе к концу).

Т.

3 голосов
/ 26 декабря 2008

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

1 голос
/ 26 декабря 2008

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

0 голосов
/ 25 июля 2009

Это основные моменты, которые делают c # функциональным 1-ламба выражения 2-методы расширения 3-й тип 4-объектные и коллекционные инициализаторы 5-Затворы 6-анонимные типы 7-Linq

...