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 : α -> β -> α
名前?