这个签名是什么 { 零 : α;追加:α -> β -> α; } 姓名?
What is this signature { zero : α; append : α -> β -> α; } name?
我有 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;
}
}
}
但在实际任务中,我需要可以将项目累加到该项目列表的Builder,以及其他具有相同累加原则的Builder。我的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 : α -> α -> α
名字是幺半群。
什么是
zero : α
append : α -> β -> α
名字?
长时间无人接听。我认为签名
zero : α
append : α -> β -> α
在数学上没有名字。
我将其命名为 AggregatingSource 或 FoldingSource。
我有 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;
}
}
}
但在实际任务中,我需要可以将项目累加到该项目列表的Builder,以及其他具有相同累加原则的Builder。我的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 : α -> α -> α
名字是幺半群。
什么是
zero : α
append : α -> β -> α
名字?
长时间无人接听。我认为签名
zero : α
append : α -> β -> α
在数学上没有名字。
我将其命名为 AggregatingSource 或 FoldingSource。