上面的答案不工作....并没有共享与Haskell的scanl相同的签名.... 基本上它是linq的“聚合”的想法的扩展......我认为这匹配Haskell的实现更好
public static IEnumerable<TResult> Scanl<T, TResult>(
this IEnumerable<T> source,
TResult first,
Func<TResult, T, TResult> combine)
{
using (IEnumerator<T> data = source.GetEnumerator())
{
yield return first;
while (data.MoveNext())
{
first = combine(first, data.Current);
yield return first;
}
}
}
使用
[TestMethod]
public void Scanl_Test()
{
var xs = new int[] { 1, 2, 3, 4, 5, 6, 7 };
var lazyYs = xs.Scanl(0, (y, x) => y + x);
var ys = lazyYs.ToArray();
Assert.AreEqual(ys[0], 0);
Assert.AreEqual(ys[1], 1);
Assert.AreEqual(ys[2], 3);
Assert.AreEqual(ys[3], 6);
Assert.AreEqual(ys[4], 10);
Assert.AreEqual(ys[5], 15);
Assert.AreEqual(ys[6], 21);
Assert.AreEqual(ys[7], 28);
}
你是绝对精彩:)是的,它是有点恶心,但它的不够好,我在寻求最近删除的语句。 – 2009-07-26 15:22:53