public U Aggregate <U>(U seed, Func <U, T, U> f) // assume base case is first and aggregate => Rest.Aggregate(f(seed, First), f);
public T Aggregate(Func <T, T, T> f) => Rest.Aggregate(First, f);