1
5
首先,我认为应该怎么称呼有些困惑
关闭
应该叫什么
λ函数
. 我认为正确的方法是调用语言中的句法元素(例如
正如在.NET中实现的(两个F&C),该 代表 实际上是对某个类中某个方法的引用。原因是 代表 使用 lambda函数 语法可能需要保持某种状态:
归还的人
代表
引用一些(未命名)对象,这些对象存储
你也提到过
自由的
和
跳跃
变量。如果你看
lambda函数
在上面的例子中,它使用两个变量。变量
这个
关闭
需要捕获所有
自由的
中的变量
λ函数
.这意味着在主体内部使用但在其他地方声明的所有变量都将被捕获。但是,C编译器不只是复制当前值。它把它变成一个可变的字段,这样就可以从所有可能访问它的函数(这也是它变得棘手的地方)访问它(也会发生变化)。这是一篇很长的博客文章的主题,但是这里有一个简单的例子,你可以用它来做实验(使用
当您调用这个方法时,结果会得到两个函数。第一个允许您读取当前状态,第二个允许您修改它。注意状态是共享的(因为它是相同的可变变量)! 有一个 proposal by Don Syme from MSR 直接向.NET添加对闭包的支持。这有点学术性,但可能有助于澄清一些事情。 |
2
4
闭包的概念在不同的语言中是相当一致的,尽管在命令式语言中,对于诸如
f的行为与c的行为非常相似,但是有一些事情使得闭包在f中的工作更容易一些。首先,虽然f是不纯的,但是突变是不受鼓励的,所以很难编写一个闭包,它无意中关闭了一个变量,而这个变量后来被修改成一种违背期望的方式。特别是,F编译器不允许在闭包内使用普通可变绑定-编译器的错误消息建议您要么使绑定不可变,要么使用显式引用单元格(类型
|
3
1
在我看来,你想学习一般的函数式编程。这样做,您就不能避免学习使用闭包的“正确”方法,因为它们对函数式编程非常重要。 不幸的是,我不知道一个好的函数式编程参考。搜索一点就会找到这篇介绍文章: Introduction to Functional Programming in C# . 如果你不介意使用其他语言,你可以考虑 The Little Schemer . 它使用方案,但只使用书中实际需要的部分。它很容易理解,但是可以直接深入到函数编程的硬部分。 至于你的另一个问题,我发现如果不改变变量,闭包在大多数语言中都是相同的——甚至Java的匿名内部类。(尽管,正如kvb所说,函数语言如f和haskell确实可以防止您在无意中错误地改变变量。) |
4
0
你读过马丁·福勒关于这个话题的论述吗?它似乎涵盖了您的担忧,并且来自一个相当权威的数字: http://martinfowler.com/bliki/Closure.html |
Thomas · 使类型别名在F中不可互换# 2 年前 |
sdgfsdh · 我该怎么说。使用异步转换函数进行收集? 6 年前 |
Soldalma · 我可以实例化包含顶级副作用值的类吗? 6 年前 |
matekus · F#-包含数字的字符串的自然排序 6 年前 |
matekus · F#类型匹配-无法创建映射或匹配记录 6 年前 |
Rob Lyndon · 未找到F#ProvidedTypes文件 6 年前 |
red-swan · 如何将intro ML.Net演示翻译为F#? 6 年前 |
jkone27 · F#-在编译时从字符串生成简单的空类型 6 年前 |