F#有免费功能吗?

时间:2010-02-08 17:45:27

标签: c# math f# function

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

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

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

4 个答案:

答案 0 :(得分:7)

F#可以在functions范围内modules作为范围(而不是类)。

CLR在内部实现这些:

  

作为只有静态成员的公共语言运行库(CLR)类

它们看起来像模块范围内的“自由功能”。

答案 1 :(得分:7)

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

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

  1. 统一性:cos在F#中看起来比调用静态方法System.Math.Cos更加惯用。
  2. 静态约束:cos不仅适用于F#中的float,它还适用于float32以及任何暴露静态Cos方法的类型,因此您可以创建自己的类型,可以应用cos函数。
  3. 我猜测不允许使用真正的自由函数,因为有许多.NET语言没有公开对它们的方便访问,因此使用它们会对跨语言互操作性构成障碍。 CLR本身确实支持自由函数,而某些语言(如C ++ / CLI)确实使用它们,但是大多数语言都将函数编译成类(即使从源代码的角度来看,它不像F#中那样)。

答案 2 :(得分:4)

@Reed的答案很好。我只是想在F#中添加你可以'打开'的模块,这样就可以以不合格的方式调用模块绑定函数,这就是各种“顶级”函数和运算符的来源,例如。

http://msdn.microsoft.com/en-us/library/ee353754(VS.100).aspx

也就是说,F#仍然受CLR机制的约束,这意味着每个函数必须在一个类中,但F#模块映射到CLR上的静态类,模块可以“打开”以提供顶层的函数等级,少数模块“自动打开”,以便立即提供最常见/最方便的功能。

提供各种常用功能对于脚本或交互式会话非常有用,您不需要打开一堆命名空间或拼出15个字符“System.Math.Cos”来计算余弦。

答案 3 :(得分:3)

与F#支持或不支持哪些功能的所有这些问题相比,您可能最好从一本关于F#的书开始。以这两个资源为出发点:

http://en.wikibooks.org/wiki/F_Sharp_Programming

还有:

The F# Survival Guide

还有克里斯史密斯的书,这是一篇优秀的介绍性文章。

Programming F#

也许你想阅读它们并通过它们进行解决,然后你可以提出更多有针对性的问题。只是一个想法。