gpt4 book ai didi

c# - 我怎样才能在 C# 中创建一个类似 monoid 的界面?

转载 作者:行者123 更新时间:2023-11-30 12:29:09 25 4
gpt4 key购买 nike

我想要求实现接口(interface)(或派生自类)的事物具有 Aggregate 的实现包括。也就是说,如果它们的类型是 T我希望他们有 Func<T,T,T> 类型的东西.在 Haskell 中,这被称为“幺半群”。

编辑:我想调用的是这样的:

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));
}
}

最佳答案

幺半群是结合运算以及该运算的恒等式。

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

幺半群的契约是,对于所有的abc:

  1. 关联性:MAppend(Mappend(a, b), c) = MAppend(a, Mappend(b, c))
  2. 左身份:MAppend(MEmpty, a) = a
  3. 正确的身份: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));
}
}

关于c# - 我怎样才能在 C# 中创建一个类似 monoid 的界面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19412850/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com