public static R FoldR <T, R>(Func <T, R, R> accumulator, R initVal, IEnumerable <T> list) { // 防止每次递归调用都创建 TailedSequence<T> 对象,做了优化处理 TailedSequence <T> _list = list as TailedSequence <T>; _list = _list ?? new TailedSequence <T>(list); if (list == TailedSequence <T> .Empty) { return(initVal); } return(accumulator(_list.Head, FoldR(accumulator, initVal, _list.Tail))); }
public static R FoldL <T, R>(Func <R, T, R> accumulator, R initVal, IEnumerable <T> list) { // 防止每次递归调用都创建 TailedSequence<T> 对象做了,优化处理 TailedSequence <T> _list = list as TailedSequence <T>; _list = _list ?? new TailedSequence <T>(list); if (list == TailedSequence <T> .Empty) { return(initVal); } return(FoldL(accumulator, accumulator(initVal, _list.Head), _list.Tail)); }