これを尋ねるのは非常に複雑に感じます。解決策は簡単に思えますが、さらに多くのデリゲートから返されたデリゲート内のデリゲートのせん断的な気が遠くなるほど、私の脳はそれ自体で内破しました。
これ以上何もせずに、私は説明します:
シナリオは、翻訳デリゲート (Func[A, B]) と翻訳動作 (Func[A, Func[Func[A, B], B]]) があることです。
アイデアは、特定の翻訳の周りに、呼び出しを翻訳にラップする特定の一連の動作を持つことです。戻り値を変更することができます (B)。
これを完全に説明するモナドはおそらくいくつかありますが、おそらくいくつかのコードが何よりも役立ちます。
被害者:
public class B
{
}
public class A
{
}
動作デリゲート
public delegate Func<Func<A, B>, B> TranslationBehavior(A input);
それらを連鎖させ、変換関数を渡すことができる Func を返し、動作によってラップされる新しい変換関数を取得する関数
static Func<Func<A, B>, Func<A, B>> Chain(IEnumerable<TranslationBehavior> behaviors)
{
throw new NotImplementedException();
}
使用シナリオ
static void Main(string[] args)
{
var behaviors = new[]
{
(TranslationBehavior) (inp => next => next(inp)),
(TranslationBehavior) (inp => next => next(inp)),
(TranslationBehavior) (inp => next => next(inp)),
};
var input = new A();
var chained = Chain(behaviors);
var output = chained(a => new B());
}
コード例では、動作の実装は何もせず、次の動作を呼び出します。変換の実装は単に新しい B を返します。
関数「チェーン」は問題の関数であり、動作を一緒にリンクできるかどうかはわかりませんでしたが、これが実際に機能することを証明するために、3 つの動作を具体的にチェーンする単純なソリューションをハードコーディングしました。
static Func<Func<A, B>, Func<A, B>> Chain(IEnumerable<TranslationBehavior> behaviors)
{
var behavior1 = (TranslationBehavior)null;
var behavior2 = (TranslationBehavior)null;
var behavior3 = (TranslationBehavior)null;
return translation => input =>
behavior1(input)(transformed1 =>
behavior2(transformed1)(transformed2 =>
behavior3(transformed2)(translation)
)
);
}
これは機能しますが、明らかに機能します。かなり役に立たない。
これに関するヘルプは本当に役に立ちます。これが既知のパターンまたはモナドであるかどうかに関する情報は非常に興味深いものです。このコードコードは一般化できるとは思えません。
前もってありがとう、スティーブン。