Что это за подпись {ноль: α; добавить: α -> β -> α; } название?
У меня есть интерфейсы 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;
}
}
}
Но в реальной задаче мне нужен Строитель, который может накапливать элементы в списке этих предметов, и другие Строители с тем же принципом накопления. Мои Строители должны реализовать следующий интерфейс:
interface IBuilderFor<TSource, TResult>
{
IBuilderFor<TSource, TResult> Append(TSource value);
TResult Result();
}
И мне нужно иметь возможность создавать Builders из подписи { zero, append }. Как это:
interface X<TSource, TResult>
{
TResult Zero { get; }
TResult Append(TResult a, TSource b);
}
Я реализовал следующий BuilderMaker для новой ситуации:
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 : α -> β -> α
название?
1 ответ
Решение
Нет ответа в течение длительного периода. А я думаю подпись
zero : α
append : α -> β -> α
не имеет имени в математике.
Я назвал это AggregatingSource или FoldingSource.