Lambda返回另一个lambda

not*_*row 9 c# lambda

有没有办法如何递归地从另一个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


Ste*_*ary 13

我相信你可以声明一个委托类型:public delegate Lambda Lambda()它返回一个自己类型的委托.无论如何,它确实可以编译.