Re: Генерализация Option
От: Sinix  
Дата: 23.11.16 13:07
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>В очередной раз тут понадобился упрощенный аналог tagged union, т.е. некий тип, представляющий собой объединение набора предопределенных типов по "или" (а не по "и", как в кортежах), и подумалось — может слегка обобщить Option до 7-8 type аргументов? Текущий тогда придется переобозвать как нибудь типа NullableOption. Ну и подумать на тему вариантов с неким общим для всех типов TCommonData и без такового.

AVK>Кто что думает?

А как оно с седьмым шарпом дружить-то будет?

operator is вроде в релиз не попадает, если ограничиться седьмым шарпом, то получается бессмысленный и беспощадный изврат в духе
    struct Is<T1, T2>
    {
        public static implicit operator T1(Is<T1,T2> t)
        {
            return t._1;
        }

        public static implicit operator T2(Is<T1, T2> t)
        {
            return t._2;
        }

        private T1 _1;
        private T2 _2;

        public Is(T1 t)
        {
            _1 = t;
            _2 = default(T2);
        }

        public Is(T2 t)
        {
            _1 = default(T1);
            _2 = t;
        }
    }
...
    var temp = new Is<int, string>("hello");
    // ...
    int intVal = temp;
    Console.WriteLine(intVal); // 0;

— эт раз.

Даже если бы попал — ADT тоже будут только в C#8, соответственно предупреждений о неполном match не будет — эт два.

Остаётся только одно решение: метод Match(Action<T1> case1, Action<T2> case2), который можно закопать не выпуская, как по мне.
Тип, который для каждого использования требует аллокации делегата с замыканием, на хороший код точно не тянет.

Я бы вообще убрал заигрывания с функциональщиной до нормальной поддержки в шарпе. Для реальных задач есть F#, для хипстеров — langext, чего ещё надо-то?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.