每个函数都必须在C#中的类型中吗?或者F#有免费功能吗?
另外我在一些F#代码中看过的函数如cos,sin等等。它们是否调用了Math.Cos,Math.Sin?
为什么他们提供cos,sin等代替Math.Cos,Math.Sin?
答案 0 :(得分:7)
答案 1 :(得分:7)
正如Reed所提到的,函数可以在模块中定义,也可以在其他ML语言中定义,但它们也可以像其他.NET语言一样在类型上定义(实际上模块也可以编译为类)。在F#中,模块可以open
来访问函数,而不必每次都使用模块名称,如果没有显式声明模块,则会在每个文件的基础上自动创建模块。
至于为什么有单独的cos
等功能,而不仅仅依赖于.NET的内置Math.Cos
等,可能有以下几个原因:
cos
在F#中看起来比调用静态方法System.Math.Cos
更加惯用。cos
不仅适用于F#中的float
,它还适用于float32
以及任何暴露静态Cos
方法的类型,因此您可以创建自己的类型,可以应用cos
函数。我猜测不允许使用真正的自由函数,因为有许多.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
还有:
还有克里斯史密斯的书,这是一篇优秀的介绍性文章。
也许你想阅读它们并通过它们进行解决,然后你可以提出更多有针对性的问题。只是一个想法。