Pull to refresh

Comments 11

Ничем. Это же «Ненормальное программирование», просто забавное наблюдение, что ленивое вычисление (или, скорее, call-by-ref) — это тоже монада, эквивалетная maybe.
Как меня поправили — call-by-ref и Lazy не эквивалентны maybe, они просто являются монадами.
Добрый день,

Спасибо за статью. Если переходит от забавы к серьезным вещам, то скажите, вы используете монады в ваших реальных/продакшен проектах? Если так то как вы смогли аргументировать факт их использования? Я по опыту могу сказать, что мне, например не удалось этого сделать так как команда сказала что монады это для хаскела а они не видят никакой прибыли от их использования в C# и что им пофиг на чистоту функций, неизменяемость и теорию категорий.
Да, мы используем nuget.org/packages/Tp.Core.Functional повсеместно в наших продакшн проектах. Как перешли? Да, в принципе, никто и не был против. У нас в компании привествуется software craftsmanship движение, а maybe просто добавляют коду явность — я явно указываю, что ожидаю праметр с возможно отсутствующим значением или наоборот — мой метод может вернут пустое значение. И компилятор мне подскажет, где я пренебрегаю этим, выдав ошибку типов. Ошибка в компайл-тайм дешевле ошибки, пойманной в тестах в десятки раз и ошибки из продакшена в сотни — простая арифметика.
Ну а Linq в вашей команде используют — если что это монада List. Async/Await — тоже монада(название у нее разное в разных языках). Даже null value (использование null вместо значения по ссылке) — тоже монада.
Ну и самый главный прикол что просто последовательное исполнение кода в C# это тоже монада — в хаскеле ее называют IO.
Все пользуются монадами — не все об этом догадываются :)
Согласен с вами полностью, мне никто не смог возразить что SelectMany это тот же самый Bind, так как крыть было нечем. Но увы невежество людское и нежелание прогрессировать на службе у толпы посильнее всех здравых убеждений. Ничего, работу всегда можно сменить, благо ее навалом.
На самом деле тут ничего удивительного нет. Вы используете не столько ленивые вычисления, сколько продолжения (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.

Articles