【发布时间】:2010-09-07 14:13:10
【问题描述】:
我正在编写一些扩展来模仿 Lisp 中的 map 和 reduce 函数。
public delegate R ReduceFunction<T,R>(T t, R previous);
public delegate void TransformFunction<T>(T t, params object[] args);
public static R Reduce<T,R>(this List<T> list, ReduceFunction<T,R> r, R initial)
{
var aggregate = initial;
foreach(var t in list)
aggregate = r(t,aggregate);
return aggregate;
}
public static void Transform<T>(this List<T> list, TransformFunction<T> f, params object [] args)
{
foreach(var t in list)
f(t,args);
}
transform 函数将减少诸如:
foreach(var t in list)
if(conditions && moreconditions)
//do work etc
这有意义吗?会不会更好?
【问题讨论】:
-
这已经存在。看看 C# 3 / LINQ。
-
是的,这是有道理的。这个问题和其他几个问题的答案显示了一个令人惊讶的缺乏对什么是reduce 函数的理解。是的,输出类型应该独立于输入类型。
Aggregate不是一个 reduce 函数,正如许多人所声称的那样。也许这就是为什么他们称之为不同的东西。
标签: c# functional-programming extension-methods