Что это за подпись {ноль: α; добавить: α -> β -> α; } название?

У меня есть интерфейсы 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.

Другие вопросы по тегам