有没有办法如何递归地从另一个lambda返回lambda?
我想做的就是有限状态机,实现为lambda,它返回实现另一个状态(或null)的lambda.
嵌套Func <>将无法正常工作.
C#,.NET 3.5
例:
机器,3个州,伪语言
private Lambda State1()
{
if (SomeConditionIsMet)
return State2;
else
return State1;
}
private Lambda State2()
{
while (SomeConditionIsMet)
return State2;
else
return State3;
}
private Lambda State3()
{
LogEnd();
return NULL;
}
public void FSM()
{
Lambda _currentState = State1;
while(_currentState != NULL)
{
_currentState = _currentState();
}
}
Run Code Online (Sandbox Code Playgroud)
我知道,例如,我可以使用enum + switch解决这个问题,但我只是好奇我是否可以这样做.
Eri*_*ert 23
当然,你可以从另一个lambda返回一个lambda:
Func<int, Func<int, int>> makeAdder = x => y => x + y;
Func<int, int> addTen = makeAdder(10);
Console.WriteLine(addTen(20)); // 30
Run Code Online (Sandbox Code Playgroud)
你遇到麻烦的语法有哪些方面?我很想知道人们如何将这种事情弄错了,因为这有助于我们下次更好地设计语言和文档.
更新:
好吧,但你不能返回lambda返回lambda
你当然可以.
Func<int, Func<int, int>> GetAdderMaker()
{
return x => y => x + y;
}
Run Code Online (Sandbox Code Playgroud)
这里我们返回一个返回lambda的lambda.为什么你认为这是不可能的?
更新:
啊哈,我明白了.你认为"lambda"这个词的意思是"代表".它不是.lambda是一种可转换为委托的表达式.
如果您想要一个返回委托的委托,那么只需声明它.这完全合法.例如,这里是一个名为"组合器"的委托 - 组合器是一个委托,它自己并返回自己:
delegate D D(D d);
Run Code Online (Sandbox Code Playgroud)
这是一个名为D的代表,它接受D并返回D.
您可以创建与此委托类型兼容的lambda表达式.例如:
D I = x=>x;
Run Code Online (Sandbox Code Playgroud)
是Identity组合器.要么
D M = x=>x(x);
Run Code Online (Sandbox Code Playgroud)
是Raymond Smullyan对组合器异想天开的表征中的Mockingbird组合器.
正如您正确指出的那样,没有办法制作这种组合子的通用Func.我在2006年写了一篇关于这个事实的文章:
http://blogs.msdn.com/ericlippert/archive/2006/06/23/standard-generic-delegate-types-part-two.aspx