我想要求实现接口(interface)(或从类派生)的事物包含Aggregate的实现。也就是说,如果它们的类型为T,我希望它们具有某种类型的Func<T,T,T>。在Haskell中,这称为“monoid”。

编辑:我想打电话是这样的:

list.Aggregate((x, accum) => accump.MAppend(x));

根据DigalD的答案,这是我的最佳尝试,但无法编译:
interface IMonoid<T>
{
    T MAppend(T other);
}

class Test
{
    public static void runTest<T>(IEnumerable<IMonoid<T>> list)
    {
        // doesn't work
        list.Aggregate((x, ac) => ac.MAppend(x));
    }
}

最佳答案

Monoid是关联操作以及该操作的标识。

interface Monoid<T> {
  T MAppend(T t1, T t2);
  T MEmpty
}

一个monoid的约定是所有abc的约定:
  • 关联性:MAppend(Mappend(a, b), c) = MAppend(a, Mappend(b, c))
  • 左身份:MAppend(MEmpty, a) = a
  • 右身份:MAppend(a, MEmpty) = a

  • 您可以使用它来添加列表中的元素:
    class Test {
      public static T runTest<T>(IEnumerable<T> list, Monoid<T> m) {
        list.Aggregate(m.MEmpty, (a, b) => m.MAppend(a, b));
      }
    }
    

    09-27 10:03