尽管非托管语言,F#在实现数学方面真的比C#好吗?如果是这样的话,为什么呢?
我认为其他人已经提到了大多数重点:
F#让您以数学家思考它们的方式解决问题
借助高阶函数,您可以使用更简单的概念来解决难题
默认情况下,一切都是不可变的,这使程序更容易理解(也更容易并行化)
绝对可以使用C#3.0中的一些F#概念,但是有一些限制.您不能使用任何递归计算(因为C#没有尾递归),这就是您以函数/数学方式编写原始计算的方法.另外,在C#中编写复杂的高阶函数(以其他函数作为参数)是很困难的,因为你必须明确地编写类型(在F#中,类型是推断的,但也会自动推广,所以你不必明确地编写功能通用).
此外,我认为Marc Gravell的以下观点并非有效的反对意见:
从维护角度来看,我认为适当命名的属性等比元组和头/尾列表更容易使用(在整个生命周期内),但这可能只是我.
这当然是真的.然而,关于F#的好处是你可以开始使用元组和头/尾列表编写程序,稍后在开发过程中将其转换为使用.NET IEnumerables和具有属性的类型的程序(这就是我相信典型的F#程序员工作*).元组等和F#交互式开发工具为您提供了一种快速原型解决方案的好方法(当做数学时,这是必不可少的,因为大多数开发只是在您寻找最佳解决方案时进行实验).拥有原型之后,您可以使用简单的源代码转换将代码包装成F#类型(也可以从C#作为普通类使用).F#还为您提供了许多方法,可以在以后的性能方面优化代码.
这为您提供了易于使用的语言(例如Python)的好处,许多人将其用于原型设计阶段.但是,一旦完成使用高效语言(例如C++或C#)的原型设计,您就不必重写整个程序,因为F#既"易于使用"又"高效",您可以流利地切换这两种风格之间.
(*)我也在我的函数式编程书中使用了这种风格.
在数学程序中,F#比C#有许多巨大的优势:
通过F#交互式会话,您可以即时运行代码以立即获取结果,甚至可以将其可视化,而无需构建和执行完整的应用程序.
F#支持一些可以在数学环境中提供大量性能改进的功能.最值得注意的是,inline
高阶函数和高阶函数的组合允许优化地计算数学代码而不会对性能产生负面影响.C#无法表达这一点.
F#支持一些功能,使得实现数学概念的可能性远远超过C#中可以获得的数学概念.例如,尾调用使得简单可靠地实现递归关系变得更加容易.C#也无法表达这一点.
数学问题通常需要使用更复杂的数据结构和算法.与C#相比,使用F#表达复杂的解决方案要容易得多.
如果你想要一个案例研究,我转换了System.Double
从2kLOC的C#转换QR分解的实现.的F#只有100行代码,运行在10×速度更快,是广义上的号码类型所以它的工作原理不仅对float32
,float
和System.Numerics.Complex
但甚至可以应用到符号矩阵以获得符号结果!
FWIW,我写这个主题的书籍以及商业软件.
F#支持度量单位,这对数学工作非常有用.
我来自数学背景,并且看过F#,但我仍然更喜欢C#用于大多数目的.F#有一些更容易的东西,但总的来说我仍然更喜欢C#.
一些被吹捧的F#好处(不变性,高阶函数等)仍然可以在C#中完成(对于后者使用委托等).当使用带有lambda支持的C#3.0时,这一点更加明显,这使得声明功能代码非常容易和富有表现力.
从维护角度来看,我认为适当命名的属性等比元组和头/尾列表更容易使用(在整个生命周期内),但这可能只是我.
C#让自己失去数学的一个领域是泛型和他们对运营商的支持.所以我花了一些时间来解决这个问题;-p我的结果可以在MiscUtil中找到,这里有概述.