对于数学,F#真的比C#好吗?

时间:2008-12-18 23:39:08

标签: c# math f#

尽管非托管语言,F#在实现数学方面真的比C#好吗?如果是这样,为什么?

7 个答案:

答案 0 :(得分:32)

我认为其他人已经提到了大部分要点:

  1. F#让你以数学家思考它们的方式解决问题
  2. 由于高阶函数,您可以使用更简单的概念来解决难题
  3. 默认情况下,一切都是不可变的,这使程序更容易理解(也更容易并行化)
  4. 您可以使用C#3.0中的一些F#概念,但确实存在一些限制。您不能使用任何递归计算(因为C#没有尾递归),这就是您以函数/数学方式编写原始计算的方法。另外,在C#中编写复杂的高阶函数(以其他函数作为参数)是很困难的,因为你必须明确地编写类型(在F#中,类型是推断的,但也会自动推广,所以你不必明确地编写功能通用)。

    此外,我认为Marc Gravell的以下观点不是有效的反对意见:

      

    从维护角度来看,我认为适当命名的属性等比元组和头/尾列表更容易使用(在整个生命周期内),但这可能只是我。

    这当然是对的。然而,关于F#的好处是你可以开始使用元组和编程来编写程序。 head / tail列表以及稍后的开发过程将其转换为使用.NET IEnumerables和具有属性的类型的程序(这就是我相信典型的F#程序员的工作原理*)。元组等和F#交互式开发工具为您提供了一种快速原型解决方案的好方法(当做数学时,这是必不可少的,因为大多数开发只是在您寻找最佳解决方案时进行实验)。拥有原型之后,您可以使用简单的源代码转换将代码包装成F#类型(也可以从C#作为普通类使用)。 F#还为您提供了很多方法,可以在以后的性能方面优化代码。

    这为您提供了易于使用的语言(例如Python)的好处,许多人将其用于原型设计阶段。但是,一旦完成使用高效语言(例如C ++或C#)的原型设计,您就不必重写整个程序,因为F#既“易于使用”又“高效”,您可以流利地切换这两种风格之间。

    (*)我也在functional programming book中使用这种风格。

答案 1 :(得分:18)

在数学程序的背景下,F#比C#有很多好处:

  • F#交互式会话允许您即时运行代码以立即获得结果even visualize them,而无需构建和执行完整的应用程序。

  • F#支持一些可以在数学环境中提供大量性能改进的功能。最值得注意的是,inline和更高阶函数的组合允许优化地计算数学代码而不会对性能产生负面影响。 C#无法表达这一点。

  • F#支持一些功能,使得实现数学概念的可能性远远超过C#中可以获得的数学概念。例如,尾调用使得简单可靠地实现递归关系变得更加容易。 C#也不能表达这一点。

  • 数学问题通常需要使用更复杂的数据结构和算法。使用F#与C#相比,表达复杂的解决方案要容易得多。

如果你想要一个案例研究,我在2kLOC的C#中转换了System.Double的QR分解实现。 F#只有100行代码,运行速度超过10倍,并且基于数字类型进行推广,因此它不仅适用于float32floatSystem.Numerics.Complex,甚至可以应用符号矩阵,以获得象征性的结果!

FWIW,我write books关于这个主题以及商业软件。

答案 2 :(得分:13)

F#支持units of measure,这对数学工作非常有用。

答案 3 :(得分:7)

我来自数学背景,并且看过F#,但我仍然更喜欢C#用于大多数目的。有一些事情让F#变得更容易,但总的来说我仍然更喜欢C#。

一些被吹捧的F#好处(不变性,高阶函数等)仍然可以在C#中完成(对于后者使用委托等)。当使用带有lambda支持的C#3.0时,这一点更加明显,这使得声明功能代码非常容易和富有表现力。

从维护角度来看,我认为适当命名的属性等比元组和头/尾列表更容易使用(在整个生命周期内),但这可能只是我。

C#让自己失去数学的一个领域是泛型和他们对运营商的支持。我花了一些时间来解决这个问题;-p我的结果在MiscUtil中提供,概述为here

答案 4 :(得分:4)

这篇文章看起来可能很相关:http://fsharpnews.blogspot.com/2007/05/ffts-again.html

另外:C# / F# Performance comparison

纯数学的最大优势在于PerpetualCoder所说的,F#看起来更像是一个数学问题,所以数学家写起来会更容易。当我查看它时,它让我想起了很多MATLAB。

答案 5 :(得分:1)

我不确定它是好还是坏,但方法肯定存在差异。静态语言指定如何解决问题。像F#或Haskell这样的函数式语言不会这样做,而且更适合数学家如何解决特定问题。那么你就有像this这样的书籍,它们擅长蟒蛇。如果你从性能的角度谈论没有什么可以打败C.如果你是从图书馆谈论我相信功能Langauges(F#和喜欢),Fortan(是的它尚未死),Python有很好的数学库。

答案 6 :(得分:-3)

功能语言的一大优势是它们可以在多处理器或多核系统上并行运行,而无需您更改任何代码。 这意味着您只需添加核心即可加快算法速度。