【问题标题】:Is F# really better than C# for math?F# 在数学上真的比 C# 更好吗?
【发布时间】:2008-12-18 23:39:07
【问题描述】:

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

【问题讨论】:

    标签: c# math f#


    【解决方案1】:

    我认为大多数重要的点已经被其他人提到了:

    1. F# 让您以数学家思考问题的方式解决问题
    2. 借助高阶函数,您可以使用更简单的概念来解决难题
    3. 默认情况下一切都是不可变的,这使得程序更易于理解(也更易于并行化)

    您可以在 C# 3.0 中使用某些 F# 概念,这是绝对正确的,但也有一些限制。您不能使用任何递归计算(因为 C# 没有尾递归),这就是您以函数/数学方式编写原始计算的方式。此外,在 C# 中编写复杂的高阶函数(将其他函数作为参数)很困难,因为您必须显式编写类型(而在 F# 中,类型是推断的,但也会自动泛化,因此您不必显式地使泛型函数)。

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

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

    这当然是真的。然而,F# 的伟大之处在于您可以开始使用元组和头/尾列表编写程序,然后在开发过程中将其转换为使用 .NET IEnumerables 和具有属性的类型的程序(这就是我认为典型的 F#程序员工作*)。 Tuples 等和 F# 交互式开发工具为您提供了一种快速原型解决方案的好方法(在进行数学运算时,这是必不可少的,因为大多数开发只是在您寻找最佳解决方案时进行试验)。一旦有了原型,就可以使用简单的源代码转换将代码封装在 F# 类型中(也可以从 C# 中将其用作普通类)。 F# 还为您提供了很多方法来优化以后的代码性能。

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

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

    【讨论】:

    • @T.P.:我对尾递归很好奇(我们知道,C# 中缺少尾递归)。在现实世界的场景中,这真的是一个大问题吗?我认为这只是优化的问题。另外我想知道当我们在 C# 中有 lambdas 时,你是否仍然认为使用高阶函数是个问题。我经常使用 lambdas。
    • @Al Kepp:以函数式方式编写程序的次数越多,就越倾向于使用递归,并且越需要尾递归。因此,您可以编写“函数式”C#,但在处理递归结构或编写递归函数时,您需要以命令式的方式编写它以获得与 F# 相同的效率。但是,lambda 本身在没有尾递归的情况下也能正常工作(直到您想使用高级技巧,如继续传递样式)。
    【解决方案2】:

    在数学程序的上下文中,F# 比 C# 有许多巨大的优势:

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

    • F# 支持一些可以在数学环境中提供大量性能改进的功能。最值得注意的是,inline 和高阶函数的组合允许在不影响性能的情况下优雅地分解数学代码。 C# 无法表达这一点。

    • F# 支持一些功能,这些功能使得实现数学概念比在 C# 中更自然地实现成为可能。例如,尾调用使简单可靠地实现递归关系变得更加容易。 C# 也无法表达这一点。

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

    如果您想要一个案例研究,我将 QR 分解的实现从 C# 的 2kLOC 转换为 System.Double。 F# 只有 100 行代码,运行速度快了 10 倍,并且在数字类型上泛化,因此它不仅适用于 float32floatSystem.Numerics.Complex,甚至可以应用于符号矩阵以获得符号结果!

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

    【讨论】:

    • 哇,刚看到你的书。但是 GPB125 ......伙计,你真的在​​给很多人定价。
    • @Dmitri:是的,只有当你打算通过编写 F# 代码来赚很多钱时,它才值得。 :-)
    • 等一下...我确实打算通过编写 F# 代码来赚很多钱。 :) 是否有示例章节或类似章节?
    【解决方案3】:

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

    【讨论】:

    • 它是任何与物理相关的生命的救星!
    • @Benjol 这一功能对我的游戏开发帮助很大。 ...时间、网络(字节、数据包等)。我喜欢度量单位的一点是,它允许我根据变量的用途命名变量,而不必担心它们包含什么。例如let damage = 5<HP>, 10<Shield> 而不是 let hpDamage, shieldDamage = 5, 10
    • @gradbot,它对我有帮助,因为数据通常以 mm/m/km 的混合形式出现,并且内部表示(至少应该是)全部以 m 为单位,然后再次输出各种格式。 UoM 能否成为匈牙利符号的解毒剂? :)
    【解决方案4】:

    我有数学背景,并且研究过 F#,但在大多数情况下我仍然更喜欢 C#。 F# 让一些事情变得更容易,但总的来说,我仍然更喜欢 C#。

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

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

    C# 在数学方面让自己失望的领域之一是泛型及其对运算符的支持。所以我花了一些时间来解决这个问题;-p 我的结果可以在MiscUtil 中找到,概述here

    【讨论】:

      【解决方案5】:

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

      还有:C# / F# Performance comparison

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

      【讨论】:

        【解决方案6】:

        我不确定它是好是坏,但方法肯定有所不同。静态语言过度指定如何解决问题。 F# 或 Haskell 等函数式语言不这样做,并且更适合数学家如何解决特定问题。然后你有像this 这样的书,它吹捧python 擅长它。如果您从性能的角度来讨论,那么没有什么能比 C 更胜一筹。如果您从库中讨论,我相信函数式语言(F# 等)、Fortan(是的,它还没有死),Python 拥有出色的数学库。

        【讨论】:

        • F# 也是一种静态类型语言 - 它只是具有出色的类型推断和其他功能,使其能够以轻量级方式指定问题。
        • >没有什么能比得上 C - 你能证明吗?
        • @SargeBorsch :我不需要证明这一点。我并不是说如果您编写废话 C 代码会很快。在我提到的语言中,它接近硬件。
        • @Perpetualcoder C 不能进行跨库优化。这是一个很大的惩罚。
        【解决方案7】:

        函数式语言的一大优点是它们可以在多处理器或多核系统上并行运行,而无需您更改任何代码。 这意味着您可以通过简单地添加内核来加速您的算法。

        【讨论】:

        • 嗯,这适用于功能性代码,而不仅仅是功能性语言。请参阅并行扩展以在 C# 中完全执行此操作。并行扩展将 (IIRC) 固定到 .NET 4.0
        猜你喜欢
        • 2012-08-03
        • 1970-01-01
        • 2011-07-16
        • 1970-01-01
        • 2019-01-08
        • 1970-01-01
        • 2013-04-07
        • 2016-12-03
        • 2021-05-11
        相关资源
        最近更新 更多