gpt4 book ai didi

f# - 是什么让 FSharpFunc<> 比 Func<> 快?

转载 作者:行者123 更新时间:2023-12-03 11:37:28 25 4
gpt4 key购买 nike

我很好奇为 FSharpFunc<> 所做的性能增强。
是不是它不包含多个委托(delegate)所以在触发函数调用时不需要循环所有引用?还要别的吗 ?

最佳答案

我认为使用 FSharpFunc<> 的主要动机而不是 Func<>或任何其他委托(delegate)是您不能创建从委托(delegate)类型继承的类(起初,这听起来很合理,但在 .NET 中,委托(delegate)实际上只是一些特殊的类,因此原则上可能允许这样做) .为什么需要这个?

如果您在 F# 中编写一个函数,那么它(在相对少数但非常重要的情况下)以柯里化(Currying)形式处理。例如 int -> int -> int实际上是函数类型int -> (int -> int) (currying 意味着你只使用单个参数的函数来编写一个函数——如果你用第一个参数调用它,你会得到一个函数作为结果,你可以用第二个参数调用返回的函数)。

如果 F# 使用委托(delegate),则类型将类似于 Func<int, Func<int, int>> .正如布赖恩所说,调用 f x y将被翻译成两个调用:f(x)(y) .然而,这种调用是最常见的(仅指定一个参数称为部分函数应用程序)。因此,当 F# 编译这样的函数时,它会创建一个具有优化调用方法的继承类,以便可以将其调用为 f.Invoke(x, y) :

class @some_F#_name@ : Func<int, Func<int, int>> {
public int Invoke(int arg1, int arg2) { /* optimized call */ }
}

不幸的是,不可能通过从标准 Func 继承来创建这样的类。 (因为它是一个委托(delegate)),所以 F# 必须声明自己的类型,它可以用作基类......

关于f# - 是什么让 FSharpFunc<> 比 Func<> 快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2111347/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com