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;
        }
    }
}

しかし、実際のタスクでは、このアイテムのリストにアイテムを蓄積できる Builder と、同じ蓄積原理を持つ他の Builder が必要です。私のビルダーは、次のインターフェイスを実現する必要があります。

interface IBuilderFor<TSource, TResult>
{
    IBuilderFor<TSource, TResult> Append(TSource value);
    TResult Result();
}

そして、{ zero, append } 署名から Builder を作成できるようにする必要があります。このような:

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;
        }
    }
}

1 点を除いてすべて問題ありません。X の名前の付け方がわかりません。

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

名前はモノイド。

とは

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

名前?

4

1 に答える 1

0

長時間応答なし。そして、私は署名だと思います

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

数学では名前がありません。

AggregatingSourceまたはFoldingSourceと名付けました。

于 2015-01-30T10:29:45.883 に答える