F#有免费功能吗?

Joa*_*nge 4 c# math f# function

每个函数都必须在C#中的类型中吗?或者F#有免费功能吗?

还有我在一些F#代码中看过的函数,比如cos,sin等等.它们是否调用了Math.Cos,Math.Sin?

还有为什么他们提供cos,sin等代替Math.Cos,Math.Sin?

Ree*_*sey 7

F#可以具有功能在作用域模块(而不是类).

CLR在内部实现这些,如下所示:

作为仅具有静态成员的公共语言运行时(CLR)类

它们看起来像模块范围内的"自由功能".


kvb*_*kvb 7

正如Reed所提到的,函数可以在模块中定义,也可以在其他ML语言中定义,但它们也可以像其他.NET语言一样在类型上定义(实际上模块也可以编译为类).在F#中,可以open编辑模块以访问函数,而无需每次都使用模块名称,并且如果未显式声明模块,则会在每个文件的基础上自动创建模块.

至于为什么有单独的cos等功能而不仅仅依赖于.NET的内置Math.Cos等,可能有以下几个原因:

  1. 统一性:cos在F#中看起来比调用静态方法更惯用System.Math.Cos.
  2. 静态约束:cos不仅适用float于F#中的s,它还适用于float32s和任何暴露静态Cos方法的类型,因此您可以创建自己的类型,cos可以应用该函数.

我猜测不允许使用真正的自由函数,因为有许多.NET语言没有公开对它们的方便访问,因此使用它们会对跨语言的互操作性造成障碍.CLR本身确实支持自由函数,而某些语言(如C++/CLI)确实使用它们,但是大多数语言将函数编译成类(即使从源代码的角度来看它不是这样的,如在F#中).

  • @Joel - 你能扩展你的意思吗?像所有单参数.NET函数一样,`System.Math.Cos`可以用作`_ - > _`,就像`cos`一样.如果它需要多个参数,那么你就是正确的. (2认同)