繁体   English   中英

编译器是如何让delegate实现惰性计算的?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM