0

我有 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 : α -> β -> α

姓名?

4

1 回答 1

0

长时间无人接听。我认为签名

zero : α
append : α -> β -> α

在数学中没有名字。

我将其命名为 AggregatingSource 或 FoldingSource。

于 2015-01-30T10:29:45.883 回答