[英]How does the compiler make delegate achieve lazy computation?
我正在学习惰性计算,由下面的代码给出
public static Func<R> Map<T, R>(this Func<T> f, Func<T, R> g)
{
return () => g(f());
}
因为 f 可能是一个计算昂贵的 function 来生成 T,这就是为什么它被包装为Func<T>
,但是Map
返回() => g(f())
,其中f()
更像是一个必须是的闭包首先准备好,所以在我看来f()
仍将在() => g(f())
中进行评估,我知道我的理解是错误的,但我不知道出了什么问题,那么编译器是如何启动的并使代码仍然惰性计算(即f()
不会在() => g(f())
中调用?
() => g(f())
表示匿名 function,仅此而已。
function 中的任何内容都不会在声明时进行评估。
f()
仅在调用匿名 function 时调用,并且在每次调用匿名 function 时调用。
() => g(f())
是一个lambda 表达式,它创建一个匿名的 function (实际上是由编译器翻译的语法糖 - 请参阅@sharplab )。
所以在我看来
f()
仍将在() => g(f())
中进行评估
是的,当() => g(f())
代表的匿名 function 会被调用/求值,即(伪文档):
Func<_> x = () => g(f()); // nothing is evaluated here
x(); // f and g are evaluted here
因此,懒惰是通过以下事实实现的:计算不会在调用Map
时执行,而是在调用其结果时执行,这很容易检查副作用。 下列:
Func<int> returnsInt = () => 1;
Func<string> mapped = returnsInt.Map(i =>
{
Console.WriteLine("Inside mapping func");
return $"Int is: {i}";
});
// nothing printed yet
Console.WriteLine("Before the eval");
Console.WriteLine(mapped());
给出下一个 output:
评估前
内部映射函数
整数是:1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.