Дайте мне посмотреть, понимаю ли я: вы используете лямбда-выражения для захвата значений в объекте-обертке - Func<T>
- и затем строите рабочий процесс с лениво оцененными функциями вокруг обернутого объекта, да?
Хотя построение его из функций работает, я лично был бы склонен построить монаду из какого-то пользовательского типа; кажется слишком легким сопоставлять функции, которые действуют на монадический тип или его «базовый» тип с экземплярами самой монады . Вы в основном строите идентификационную монаду , используя функции; Я был бы более склонен просто создать класс или интерфейс с именем, которое отражает цель, для которой вы помещаете монаду идентификации.
Вы также можете рассмотреть возможность переименования ваших методов. Ваше «To» традиционно называется «Bind», а ваше «ToIdentity» традиционно называется «Unit».
То есть шаблон монады для типа монады M<T>
обычно имеет методы:
public static M<V> Bind<U, V>(this M<U> m, Func<U, M<V>> k)
и
public static M<T> Unit<T>(this T value)
Привязка позволяет вам реализовать композицию функций для монад, аналогичную функциям, которые составляются для «базовых» типов монад.
Подробное описание чудес монад в C # см. В моей замечательной статье Уэса Дайера по этому вопросу:
http://blogs.msdn.com/b/wesdyer/archive/2008/01/11/the-marvels-of-monads.aspx
Чтобы ответить на ваш актуальный вопрос:
Они уже есть в библиотеке .net?
Эти точные функции не находятся в рамках. Но функции очень похожи на те, которые существуют в рамках. Например, SelectMany
на IEnumerable<T>
аналогичен вашему To
методу; он реализует операцию монадического связывания для последовательностей. new Nullable<int>(123)
аналогично вашему методу "ToIdentity"; он реализует монадическую единицу операции для «возможно, монады». И так далее.
Система типов CLR недостаточно богата, чтобы выразить образец монады в целом ; для этого вам нужна система «более высокого» типа, как в Haskell. Вам придется создавать каждую конкретную монаду самостоятельно. Тем не менее, похоже, что вы уже в пути.
Еще несколько мыслей об использовании монад в C # -подобных языках:
Монады в C # - почему реализации Bind требуют, чтобы переданная функция возвращала монаду?
Монада на простом английском? (Для программиста ООП без фона FP)
Почему в предстоящем .NET 4.0
нет ничего похожего на IMonad
Помогите разработчику C # понять: что такое монада?