我有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;
}
}
}
但是在实际任务中,我需要可以将项目累积到这些项目列表的构建器,以及其他具有相同累积原理的构建器。 My Builders必须实现下一个界面:
interface IBuilderFor<TSource, TResult>
{
IBuilderFor<TSource, TResult> Append(TSource value);
TResult Result();
}
我需要有可能从{zero,append}签名创建Builders。像这样:
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 : α -> β -> α
名字?
答案 0 :(得分:0)
长期没有回答。我认为签名
zero : α
append : α -> β -> α
在数学方面没有名字。
我将其命名为AggregatingSource或FoldingSource。