我想要求实现接口(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的约定是所有
a
,b
和c
的约定: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));
}
}