用功能语言进行科学数学?

时间:2009-06-08 18:31:20

标签: math functional-programming scientific-computing

是否有使用函数式编程语言制作的严肃的科学数学库?从功能语言的本质来看,人们会认为它们特别适合数学,但众所周知的算法似乎是程序性的。

例如,经典Numerical Recipes系列几乎是以程序方式编写的。 LAPACK在许多领域几乎都是事实上的标准,但它在Fortran中,因此是程序性的,也可能是OO,但绝对不起作用。

有没有人能够将这些着名的程序算法转换为功能样式?

更新:似乎是在符号计算中使用了函数式语言,例如在Mathematica。但是,是否存在与数字计算和功能算法本质上不兼容的东西?或者只是因为命令式算法首先被发明,没有人打算提出功能等价物?

7 个答案:

答案 0 :(得分:24)

hackageDB中有一个用于数字内容的Haskell库:hmatrix。它来自LAPACK,BLAS和GSL(GNU科学图书馆)。

但是你应该记住,使用monads(更具体地说,状态变换器)可以很容易地将命令式算法转换为纯函数式语言。实际上,任何有效的就地实现通常都必须使用这种机制来提供纯函数语言中的可变变量。

至于遵循功能风格,在许多情况下是不可能的。对于许多问题,没有任何(有效的)功能方法已知。当然,你可以让这些算法在Haskell中工作,但是它们看起来与用Matlab,Fortran或C编写它们的方式不同。

编辑:

这是明显的不兼容,以及首先出现的问题:

  1. 高效的数值算法通常需要可变数据。虽然这在纯功能设置中是可行的,但它并不像命令式语言那样简单。但这两种计算模型完全相同。
  2. 底层机器(例如指令集)一直是并且仍然是必不可少的,除了极少数例外(!)。考虑到真实机器的建模方式,命令编码算法更容易分析和优化。
  3. 虽然基础数学允许相对容易地推导出功能解决方案,但您将无法获得有效的算法(就像直接从数学中推导出命令式解决方案一样)。由于大多数努力一直并且仍然针对强制性解决方案,因此功能性对应物根本就不为人知。功能性对应物是指能够正确表达功能意图和风格的代码。
  4. 有很多可以重复使用的命令式代码。其中大部分可以使用状态转换器转录为函数式语言,但它仍然看起来势在必行。
  5. 我实际上认为像Haskell这样的纯函数语言可能对编码算法有益:可以统一数学描述,算法本身和某种类型导向的证明(即使用 Curry-Howard同构< / em>)在同一块代码中。

答案 1 :(得分:7)

我将LAPACK用作功能语言的黑盒而不是尝试重写它。几十年来,一些非常聪明的人对LAPACK进行了测试,微调,优化等。我不会碰它。

答案 2 :(得分:5)

本着优秀的计算机程序结构和解释的精神,还有Structure and Interpretation of Classical Mechanics。本书使用Scheme来阐明在力学变分方法中使用的许多松散的数学符号。

本书的基石是scmutils package,其中包括许多计算任务的功能性方法,如集成和最小化。

答案 3 :(得分:5)

很棒的问题!

我已经成为这个领域少数几个先驱者之一,而且我们最近才刚刚达到可以同时获得类似Fortran的性能和类似Python的简洁性的地步。问题。在详细研究了所有可用的函数语言及其实现之后,我决定将我的工作重点放在静态类型的不纯函数语言上:.NET的开源OCaml programming languageMicrosoft's F# programming language。 p>

我的书OCaml for Scientists涵盖了OCaml programming language使用Linux或Mac OS X的科学计算。我的书F# for Scientists涵盖了使用Windows和Visual Studio Microsoft's F# programming language进行科学计算。我公司还销售完全用F#编写的F# for NumericsF# for Visualization库,并在内部广泛使用函数式编程,以提高简洁性,清晰度和可维护性,并在外部使库更易于使用。例如,一流的函数允许您非常容易地绘制图形,例如绘制正弦函数:

Plot([Function sin], (-5., 5.))

F#for Visualization甚至会尝试可视化任何类型的任何值you can give it a matrix of arbitrary-precision rationals and it will display the result as typeset mathematics

我们在OCaml和F#语言中以函数式编写科学计算代码取得了巨大成功。特别是,F#可以很容易地编写通用的高性能并行代码,而不会对抽象产生任何性能损失。因此,您可以实现适用于任何类型矩阵的QR分解(单精度,双精度,复杂甚至符号!)甚至beat the performance of vendor-tuned libraries like the Intel MKL

最后,我应该注意到,在我做之前很长一段时间,Mathematica在某种程度上开辟了这条道路。然而,他们的解决方案是将用C编写的巨大的数字和符号函数标准库与传统的命令式结合起来,并提供一种相当基本的函数式编程语言来调用这些函数。他们的方法的主要缺点是用Mathematica编写的通用代码(即时间不在其标准库中的时间)大约比C慢1000倍。

答案 4 :(得分:4)

几个计算机代数系统(例如Maxima)在内部使用基于LISP的语言来表示符号计算/语法树。

数学,函数语言的例子:

http://en.wikipedia.org/wiki/J_(programming_language)

http://en.wikipedia.org/wiki/K_(programming_language)

无论如何,有几个数学问题和算法在功能风格上不能很好地制定或有效。有效的实施始终是必不可少的。例如:Eratosthenes的筛子

答案 5 :(得分:3)

我相信mathematica使用自己的功能语言。

答案 6 :(得分:3)

定义“严肃”。请记住,函数式语言(LISP除外)是相当新的--Backes的原始论文仅在70年代后期,而生产工程函数式语言是相当新的。众所周知且广为接受的数字包都是基于算法和代码开始于60年代末和70年代早期 - BLAS于1979年首次出版。因为,对于生产用途,人们往往倾向于良好的知道和信任的软件包,对旧的FORTRAN代码有很大的推动力。

但肯定有人在使用函数式语言进行数字处理。正如另一个答案所指出的,Mathematica越来越多地成为一种函数数字语言,并且越来越多地实现。