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

Joo*_*kka 26 math functional-programming scientific-computing

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

例如,经典的数字食谱系列几乎是以程序的方式编写的.LAPACK在许多领域几乎都是事实上的标准,但它在Fortran中,因此是程序性的或者可能是OO,但绝对不具备功能性.

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

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

Edu*_*anu 24

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

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

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

编辑:

这既是明显的不兼容性,也是首先出现的问题:

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

我实际上认为像Haskell这样的纯函数语言可能对编码算法有益:可以在同一块代码中统一数学描述,算法本身和某种面向类型的证明(即使用Curry-Howard同构) .


Joh*_*ook 7

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


Tim*_*omb 5

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

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


Jon*_*rop 5

好问题!

几年来,我一直是该领域为数不多的先驱者之一,而且我们最近才达到了能够同时获得类似Fortran性能和类似Python的简洁性以解决各种问题的程度.在详细研究了所有可用的函数语言及其实现之后,我决定将我的工作重点放在静态类型的不纯函数语言上:开源OCaml编程语言Microsoft的 .NET F#编程语言.

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

Plot([Function sin], (-5., 5.))
Run Code Online (Sandbox Code Playgroud)

F#for Visualization甚至会尝试可视化任何类型的任何值,因此您可以为其提供任意精度有理数的矩阵,并将结果显示为排版数学.

我们在OCaml和F#语言的函数式编写科学计算代码方面取得了巨大成功.特别是,F#可以很容易地编写通用的高性能并行代码,而不会对抽象产生任何性能损失.因此,您可以实现适用于任何类型矩阵的QR分解(单精度,双精度,复杂甚至符号!)甚至超过供应商调整的库(如英特尔MKL)的性能!

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