Здравствуйте, 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