【发布时间】:2008-12-18 23:39:07
【问题描述】:
尽管有非托管语言,F# 在实现数学方面真的比 C# 更好吗?如果是这样,为什么?
【问题讨论】:
尽管有非托管语言,F# 在实现数学方面真的比 C# 更好吗?如果是这样,为什么?
【问题讨论】:
我认为大多数重要的点已经被其他人提到了:
您可以在 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 也使用这种风格。
【讨论】:
在数学程序的上下文中,F# 比 C# 有许多巨大的优势:
F# 交互式会话让您可以即时运行代码并立即获得结果even visualize them,而无需构建和执行完整的应用程序。
F# 支持一些可以在数学环境中提供大量性能改进的功能。最值得注意的是,inline 和高阶函数的组合允许在不影响性能的情况下优雅地分解数学代码。 C# 无法表达这一点。
F# 支持一些功能,这些功能使得实现数学概念比在 C# 中更自然地实现成为可能。例如,尾调用使简单可靠地实现递归关系变得更加容易。 C# 也无法表达这一点。
数学问题通常需要使用更复杂的数据结构和算法。与 C# 相比,使用 F# 表达复杂的解决方案要容易得多。
如果您想要一个案例研究,我将 QR 分解的实现从 C# 的 2kLOC 转换为 System.Double。 F# 只有 100 行代码,运行速度快了 10 倍,并且在数字类型上泛化,因此它不仅适用于 float32、float 和 System.Numerics.Complex,甚至可以应用于符号矩阵以获得符号结果!
FWIW,我 write books 关于这个主题以及商业软件。
【讨论】:
F# 支持units of measure,这对于数学工作非常有用。
【讨论】:
let damage = 5<HP>, 10<Shield> 而不是 let hpDamage, shieldDamage = 5, 10【讨论】:
这篇文章看起来可能是相关的:http://fsharpnews.blogspot.com/2007/05/ffts-again.html
还有:C# / F# Performance comparison
纯数学的最大优势是 PerpetualCoder 所说的,F# 看起来更像是一道数学题,所以对于数学家来说会更容易写。看着它让我想起了很多MATLAB。
【讨论】:
我不确定它是好是坏,但方法肯定有所不同。静态语言过度指定如何解决问题。 F# 或 Haskell 等函数式语言不这样做,并且更适合数学家如何解决特定问题。然后你有像this 这样的书,它吹捧python 擅长它。如果您从性能的角度来讨论,那么没有什么能比 C 更胜一筹。如果您从库中讨论,我相信函数式语言(F# 等)、Fortan(是的,它还没有死),Python 拥有出色的数学库。
【讨论】:
函数式语言的一大优点是它们可以在多处理器或多核系统上并行运行,而无需您更改任何代码。 这意味着您可以通过简单地添加内核来加速您的算法。
【讨论】: