问这个问题感觉很复杂,虽然解决方案看起来很简单,但从更多代表返回的代表内部的代表令人难以置信的剪切思维导致我的大脑自爆。
不用多说,我将解释:
场景是您有翻译委托 (Func[A, B]) 和翻译行为 (Func[A, Func[Func[A, B], B]])。
这个想法是,围绕给定的翻译,您将有一组特定的行为,将调用包装到翻译中,即,他们接受 A,随意处理他们想要的,将其传递给下一个行为,同时能够更改返回值 (B)。
可能有一些 monad 可以完美地描述这一点,但也许一些代码会比任何东西都更有帮助。
受害者:
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。
函数“链”是问题函数,能够将行为链接在一起让我望而却步,但为了向我自己证明这应该有效,我硬编码了一个幼稚的解决方案,专门将三个行为链接在一起:
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)
)
);
}
这有效,但显然是;很没用。
对此的任何帮助都将非常有用,并且有关这是否是已知模式或 monad 的任何信息都将非常有趣,我认为此代码代码远非可推广。
在此先感谢斯蒂芬。