好问题!
几年来,我一直是该领域的少数先驱之一,我们直到最近才达到可以同时获得类似 Fortran 的性能和类似 Python 的简洁性来解决各种问题的地步。在详细检查了所有可用的函数式语言及其实现之后,我决定将精力集中在静态类型的不纯函数式语言上:开源OCaml 编程语言和Microsoft用于 .NET的 F# 编程语言。
我的《OCaml for Scientists 》一书涵盖了使用 Linux 或 Mac OS X的OCaml 编程语言的科学计算。我的《科学家的 F# 》一书涵盖了使用 Windows 和 Visual Studio的 Microsoft F# 编程语言的科学计算。我的公司还销售F# for Numerics和F# for Visualization库,它们完全用 F# 编写,并在内部广泛使用函数式编程以提高简洁性、清晰度和可维护性,并在外部使库更易于使用。例如,一流的函数可以让您非常轻松地绘制图形,例如绘制正弦函数:
Plot([Function sin], (-5., 5.))
F# for Visualization 甚至会尝试可视化任何类型的任何值,因此您可以给它一个任意精度的有理数矩阵,并将结果显示为排版 math。
我们在 OCaml 和 F# 语言中以函数式风格编写科学计算代码取得了巨大成功。特别是,F# 可以轻松编写通用的高性能并行代码,而不会对抽象造成任何性能损失。因此,您可以实现适用于任何类型(单精度、双精度、复杂甚至符号!)矩阵的 QR 分解,甚至可以击败英特尔 MKL 等供应商调整库的性能!
最后,我应该指出,Mathematica 早在我之前就在某种程度上开辟了这条道路。然而,他们的解决方案是将用 C 语言编写的庞大的数值和符号函数标准库与传统的命令式风格相结合,并提供一种相当基本的函数式编程语言来调用这些函数。他们的方法的主要缺点是用 Mathematica 编写的通用代码(即,时间主要不是花在他们的标准库中)比 C 慢大约 1,000 倍。