Lambda 返回另一个 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();
}
}
我知道,我可以使用 enum+switch 来解决此问题,但我只是好奇是否可以做到这一点。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
当然,您可以从另一个 lambda 返回一个 lambda:
您在语法的哪个方面遇到了问题?我很想知道人们是如何犯这种错误的,因为这有助于我们下次更好地设计语言和文档。
更新:
当然可以。
这里我们返回一个返回 lambda 的 lambda。为什么你认为这是不可能的?
更新:
啊哈,我明白了。您认为“lambda”一词的意思是“委托”。事实并非如此。 lambda 是一种可转换为委托的表达式。
如果您想要一个返回委托的委托,那么只需声明即可。这是完全合法的。例如,这里有一个名为“组合器”的委托——组合器是一个接受自身并返回自身的委托:
这是一个名为 D 的委托,它接受一个 D 并返回一个 D。
您可以创建一个 lambda 表达式 em> 与此委托类型兼容。例如:
是 Identity 组合器。或者
是 Raymond Smullyan 对组合器异想天开的描述中的知更鸟组合器。
正如您正确地注意到的那样,无法创建这种组合器的通用 Func。我早在 2006 年就写过一篇关于这一事实的文章:
http://blogs.msdn.com/ericlippert/archive/2006/06/23/standard-generic-delegate-types-part-two.aspx
Sure, you can return a lambda from another lambda:
What aspect of the syntax are you having trouble with? I am interested to know how people get this sort of thing wrong because that helps us design the language and documentation better next time.
UPDATE:
Sure you can.
Here we are returning a lambda that returns a lambda. Why do you believe this is impossible?
UPDATE:
Aha, I understand. You believe that the word "lambda" means "delegate". It does not. A lambda is a kind of expression that is convertible to a delegate.
If you want a delegate that returns a delegate then just declare that. That's perfectly legal. For example, here's a delegate called a "combinator" -- a combinator is a delegate which takes itself and returns itself:
That's a delegate named D which takes a D and returns a D.
You can make a lambda expression that is compatible with this delegate type. For example:
is the Identity combinator. Or
is the Mockingbird combinator in Raymond Smullyan's whimsical characterization of combinators.
As you correctly note, there's no way to make a generic Func that is this kind of combinator. I wrote an article about this fact back in 2006:
http://blogs.msdn.com/ericlippert/archive/2006/06/23/standard-generic-delegate-types-part-two.aspx
我相信您可以声明一个委托类型:
public delegate Lambda Lambda()
,它返回其自己类型的委托。无论如何,它确实可以编译。I believe you can declare a delegate type:
public delegate Lambda Lambda()
which returns a delegate of its own type. It does compile, anyway.您的问题已经得到解答,但阅读本文的人可能有兴趣注意到,您可以使用此技术将 Lambda 演算嵌入到 C# 中。
首先:
使用 http://en.wikipedia.org/wiki/Lambda_calculus 我定义了各种原语如下:
有关各种测试和整个代码,请参阅:http://code.google.com/p/jigsaw-library/source/browse/trunk/Theory/EmbeddedLambdaCalculus.cs
Your question is already answered, but those reading this may be interested to note that you can use this technique to embed the Lambda calculus in C#.
First starting with:
Using various function definitions found at http://en.wikipedia.org/wiki/Lambda_calculus I defined various primitives as follows:
For various tests and the whole code see: http://code.google.com/p/jigsaw-library/source/browse/trunk/Theory/EmbeddedLambdaCalculus.cs
您可以使用一种方法来构建并返回 表达式树:
另外在 .NET 4.0 得到了极大的增强。
You can have a method which builds and returns an expression tree:
Also building expression trees in .NET 4.0 has been greatly enhanced.