Ejemplo n.º 1
0
        public static DataType Fupdate(Del f, int i, DataType ts)
        {
            if (ts is One one)
            {
                if (i == 0)
                {
                    return(new One(f(one.Alpha), one.RList));
                }
                return(Cons(one.Alpha, Fupdate(f, i - 1, new Zero(one.RList))));
            }

            if (ts is Zero zero)
            {
                RList <Tuple <T, T> > .Del fp0 = value => new Tuple <T, T>(f(value.Item1), value.Item2);
                RList <Tuple <T, T> > .Del fp1 = value => new Tuple <T, T>(value.Item1, f(value.Item2));
                var fp = i % 2 == 0 ? fp0 : fp1;
                return(new Zero(RList <Tuple <T, T> > .Fupdate(fp, i / 2, zero.RList)));
            }

            throw new ArgumentException("must be Zero or One", nameof(ts));
        }