Могу ли я получить те же преимущества функционального программирования (F #), используя больше статических методов в C #? - PullRequest
7 голосов
/ 28 апреля 2009

Признаюсь, я еще не нажал F #. Но в описаниях 30 000 футов они продолжают говорить о легком тестировании кода, который не имеет изменяемого состояния. Это то же самое, что статические методы?

Могу ли я получить преимущество от F #, написав часть своего кода в классах со всеми статическими методами?

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

Ответы [ 7 ]

8 голосов
/ 28 апреля 2009

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

8 голосов
/ 28 апреля 2009

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

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

5 голосов
/ 29 апреля 2009

Помимо статических, функциональных модулей и объектов, вы можете попытаться получить некоторые преимущества F #, используя C # 3 и лямбда-выражения, LINQ и т. Д. Однако это не так уж далеко. Что мне нравится в F #:

  • Вывод везде
  • Автообобщение (добавляет параметры типа, поэтому мне не нужно разбирать его вручную)
  • Легкая неизменность
  • Простое сочетание между модулем и классами
  • Типы, подобные дискриминированным союзам
  • Сопоставление с образцом
  • Вложенные функции (облегченные)
  • Функции первого класса (нет, именованные делегаты C # не учитываются)
  • Все есть выражение
  • Простая функция композиции

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

Так что, если вы сильно отойдете от проторенного пути LINQ и Enumerable расширений, вы, вероятно, окажетесь в мире боли.

4 голосов
/ 29 апреля 2009

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

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

3 голосов
/ 28 апреля 2009

Нет, это не то же самое, что статические методы. У вас нет изменяемого состояния, если вы ничего не назначаете (локальные, аргументы функций, статические поля, поля экземпляров) после того, как оно инициализировано. Вы можете получить некоторые из преимуществ, разработав свои классы как неизменяемые.

2 голосов
/ 28 апреля 2009

Нет, эти два понятия не связаны. Статические методы в C # могут по-прежнему изменять входящие объекты как обычно, а другие переменные, используя ref или out.

1 голос
/ 07 июля 2009

ЭТО правда. Вы не получите преимущества функционального программирования, просто используя больше статических функций в C #. Как бы то ни было, если бы вы заглянули под капот (например, с помощью Reflector), я понимаю, что простой оператор let является статической функцией. Другими словами,

//F#
let a = 2

как функция в C #

//C#
static int a()
{
    return 2;
}

Я могу понять путаницу.

Объяснение взято из Леона Бамбрика "F # Eye для презентации C # Guy".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...