public static T Lookup(int i, DataType ts) { if (ts is One one) { if (i == 0) { return(one.Alpha); } return(Lookup(i - 1, new Zero(one.RList))); } if (ts is Zero zero) { var node = RList <Tuple <T, T> > .Lookup(i / 2, zero.RList); if (i % 2 == 0) { return(node.Item1); } return(node.Item2); } throw new ArgumentException("must be Zero or One", nameof(ts)); }