- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我很好奇为 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/
查看 FSharp.Core 和 PowerPack 中的源代码,我看到许多接受具有两个或多个参数的函数的高阶函数使用 FSharpFunc.Adapt .例如: let mapi f (arr: R
如 this question 中所述, 方法期望 Func不接受 F# 函数值。 重载方法以使其接受 F# 函数值的好方法是什么? 最佳答案 我知道这不是您要问的,而是直接尝试从用 C# 编写的代码
我很好奇为 FSharpFunc<> 所做的性能增强。 是不是它不包含多个委托(delegate)所以在触发函数调用时不需要循环所有引用?还要别的吗 ? 最佳答案 我认为使用 FSharpFunc<>
对于这段代码: module Module = let func x y z = 0 [] let main args = func 1 fun
我想在 F# 中编写一个函数,它向 C# 公开以下类型签名: public static FSharpFunc,Unit> foo(Action f) 在 F# 中,我尝试编写: let foo (f
尝试将 Action 传递给 F# 代码会在 .net 4.6.1、VS2015 中产生以下语法错误... Error CS1503 Argument 1: cannot convert fro
我是一名优秀的程序员,十分优秀!