我有 Monoid 和 Builder 接口:
interface IMonoidFor<T>
{
T Zero { get; }
T Append(T a, T b);
}
interface IBuilderFor<T>
{
IBuilderFor<T> Append(T value);
T Result();
}
并想实现从 Monoid 到 Builder 的转换算法。我试图这样做,并创建了这样的东西:
class BuilderMakerFor<T>
{
public IBuilderFor<T> MakeFrom(IMonoidFor<T> monoid)
{
return new Product(monoid);
}
class Product
: IBuilderFor<T>
{
readonly IMonoidFor<T> _monoid;
T _result;
public Product(
IMonoidFor<T> monoid)
{
_monoid = monoid;
_result = _monoid.Zero;
}
public IBuilderFor<T> Append(T value)
{
_result = _monoid.Append(_result, value);
return this;
}
public T Result()
{
return _result;
}
}
}
但在实际任务中,我需要可以将项目累积到该项目列表的构建器,以及具有相同累积原理的其他构建器。我的 Builders 必须实现下一个接口:
interface IBuilderFor<TSource, TResult>
{
IBuilderFor<TSource, TResult> Append(TSource value);
TResult Result();
}
而且我需要有可能从 { zero, append } 签名创建构建器。像这样:
interface X<TSource, TResult>
{
TResult Zero { get; }
TResult Append(TResult a, TSource b);
}
我针对新情况实施了下一个 BuilderMakerFor:
class BuilderMakerFor<TSource, TResult>
{
public IBuilderFor<TSource, TResult> MakeFrom(X<TSource, TResult> x)
{
return new Product(x);
}
class Product
: IBuilderFor<TSource, TResult>
{
readonly X<TSource, TResult> _x;
TResult _result;
public Product(
X<TSource, TResult> x)
{
_x = x;
_result = _x.Zero;
}
public IBuilderFor<TSource, TResult> Append(TSource value)
{
_result = _x.Append(_result, value);
return this;
}
public TResult Result()
{
return _result;
}
}
}
一切都很好,除了一点:我不知道如何命名 X。
zero : α
append : α -> α -> α
名字叫 Monoid。
什么是
zero : α
append : α -> β -> α
姓名?