public static T Factorial <T>( this IExpressionEvaluator <T> evaluator, T @base ) where T : struct, IComparable <T>, IEquatable <T> { var sequence = evaluator.Sequence( @base, (ev, n, i) => ev.Subtract(n, ev.GetValue(1)), (ev, n, i) => n.CompareTo(ev.GetValue(0)) > 0 ); var result = evaluator.Product(sequence); return(result); }