Comments 11
Добрый день,
Спасибо за статью. Если переходит от забавы к серьезным вещам, то скажите, вы используете монады в ваших реальных/продакшен проектах? Если так то как вы смогли аргументировать факт их использования? Я по опыту могу сказать, что мне, например не удалось этого сделать так как команда сказала что монады это для хаскела а они не видят никакой прибыли от их использования в C# и что им пофиг на чистоту функций, неизменяемость и теорию категорий.
Спасибо за статью. Если переходит от забавы к серьезным вещам, то скажите, вы используете монады в ваших реальных/продакшен проектах? Если так то как вы смогли аргументировать факт их использования? Я по опыту могу сказать, что мне, например не удалось этого сделать так как команда сказала что монады это для хаскела а они не видят никакой прибыли от их использования в C# и что им пофиг на чистоту функций, неизменяемость и теорию категорий.
Да, мы используем nuget.org/packages/Tp.Core.Functional повсеместно в наших продакшн проектах. Как перешли? Да, в принципе, никто и не был против. У нас в компании привествуется software craftsmanship движение, а maybe просто добавляют коду явность — я явно указываю, что ожидаю праметр с возможно отсутствующим значением или наоборот — мой метод может вернут пустое значение. И компилятор мне подскажет, где я пренебрегаю этим, выдав ошибку типов. Ошибка в компайл-тайм дешевле ошибки, пойманной в тестах в десятки раз и ошибки из продакшена в сотни — простая арифметика.
Ну а Linq в вашей команде используют — если что это монада List. Async/Await — тоже монада(название у нее разное в разных языках). Даже null value (использование null вместо значения по ссылке) — тоже монада.
Ну и самый главный прикол что просто последовательное исполнение кода в C# это тоже монада — в хаскеле ее называют IO.
Все пользуются монадами — не все об этом догадываются :)
Ну и самый главный прикол что просто последовательное исполнение кода в C# это тоже монада — в хаскеле ее называют IO.
Все пользуются монадами — не все об этом догадываются :)
На самом деле тут ничего удивительного нет. Вы используете не столько ленивые вычисления, сколько продолжения (continuations). Существует очень глубокая связь между монадами и продолжениями. Об этом довольно хорошо написал Dan Piponi в статье The Mother of all Monads.
А вы реально эксепшены на русском пишете (по поводу фиддла)? :D
У Марка Симана есть хорошая заметка насчет монады Maybe в .NET. Соль в том, что можно ничего не подключать и не реализовывать, ведь она у вас давно уже есть, вы просто раньше ее не замечали.
Пример кода
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
namespace Ploeh.Samples.Booking.DomainModel
{
public class Maybe<T> : IEnumerable<T>
{
private readonly IEnumerable<T> values;
public Maybe()
{
this.values = new T[0];
}
public Maybe(T value)
{
this.values = new[] { value };
}
public IEnumerator<T> GetEnumerator()
{
return this.values.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return this.GetEnumerator();
}
}
public static class Maybe
{
public static Maybe<T> ToMaybe<T>(this T value)
{
return new Maybe<T>(value);
}
public static Maybe<T> Empty<T>()
{
return new Maybe<T>();
}
}
}
Sign up to leave a comment.
Монада Maybe на стероидах