Re[46]: Есть ли вещи, которые вы прницпиально не понимаете...
От: akava Беларусь kavaleu.ru
Дата: 12.01.14 11:57
Оценка:
Здравствуйте, AlexRK, Вы писали:

Дисклаймер: я только-только начинаю постигать смысл монад, поэтому могу ошибиться.

ARK>Пардон, что влезаю в разговор, но разве можно оставить существующий код без изменения при замене T на option<T>? По-моему, это очень опасно. Получается, придется брать какое-то значение по умолчанию и надеяться, что во всех местах оно подойдет.

В том-то и прелесть монад, что можно. В общем это зависит от самой монады, но конкретно с optional поступают так. Если есть операция F(t1,t2,...)над элементами типа T (или нескольких типов T1, T2, T3, ...), то та же самая операция над optional<T> возвращает null если хоть одно из значений null и F(t1,t2,...) все значения не null.
Причем, насколько я понимаю, это преобразование может сделать компилятор. Т.е. да, код выше не измениться.


Немного кода.
"Волшебный" метод bind, который из функции F<T> делает функцию F<optional<T>> (могу наврать с типами и все такое)
public Func<optional<T1>,optional<T2>, ...,optional<Tn>,optional<T0>> Bind<T1,T2, ...,Tn,T0>(Func<T1,T2, ..., Tn, T0> func){
    return (o1, o2, ..., on) =>     {
                if (anyIsNull(o1,o2,...,on)
                    return null;
                else
                    func(o1.val(),o2.val(), ...,on.val());
        };
}


Тогда код Синклера никак не поменяется, но использоваться будет новая функция, созданная компилятором.




Супер! Я в восторге. Еще один из монадных принципов "щелкнул".
AlexRK, спасибо, что своим вопросом заставил меня задуматься и понять что же хотел сказать Синклер.


СУВ, akava
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.