Я не уверен, в какой степени это действительно вопрос. Однако вот некоторые типичные шаблоны, которые я использую для кодирования этих функциональных конструкций в C # (некоторые из них взяты из моей книги, в которой имеется исходный код ).
Дискриминационные объединения - действительно, нет хорошего способа реализовать дискриминационные объединения в C # - единственное, что вы можете сделать, это реализовать их как иерархию классов (с базовым классом, представляющим тип DU, и производный класс для каждого случая DU). Вы также можете добавить свойство Tag
(некоторого типа enum
) к базовому классу, чтобы упростить проверку того, какой случай представляет класс. Насколько я знаю, это используется в деревьях выражений LINQ (которые действительно должны быть различены как объединение).
Сопоставление с образцом - вы, вероятно, никогда не получите это полностью общим способом (например, с вложенными образцами), но вы можете смоделировать сопоставление с образцом на различимых объединениях, подобных этому (используя тип Option<int>
, который либо Some of int
, либо None
):
Option<int> value = GetOption();
int val;
if (value.TryMatchSome(out val))
Console.WriteLine("Some {0}", val);
else if (value.TryMatchNone())
Console.WriteLine("None");
Не идеально, но, по крайней мере, вы получаете относительно хороший способ извлечения значений из дел.
Передача сообщений - существует Время выполнения параллелизма и координации , которое в некоторых отношениях также основано на передаче сообщений и может использоваться в C #. Могу поспорить, что вы также можете использовать процессор почтовых ящиков F # из C #, используя технику, основанную на итераторах, которую я описал в этой статье , и которая также используется в библиотеке Wintellect PowerThreading. Тем не менее, я не думаю, что кто-то реализовал надежную библиотеку передачи сообщений, основанную на этой идее.
Таким образом, вы можете смоделировать многие функциональные возможности в C #, по крайней мере, в некоторой степени и использовать другие без каких-либо проблем (лямбда-функции и функции высшего порядка). Однако, если вам нужна вся мощь F #, вам просто нужно убедить вашу компанию начать использовать F #: -).