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中编写的算法没什么不同.
编辑:
这既是明显的不兼容性,也是首先出现的问题:
我实际上认为像Haskell这样的纯函数语言可能对编码算法有益:可以在同一块代码中统一数学描述,算法本身和某种面向类型的证明(即使用Curry-Howard同构) .
本着优秀的计算机程序结构和解释的精神,还有经典力学的结构和解释.本书使用Scheme来阐明在力学的变分方法中使用的许多松散的数学符号.
本书的基础是scmutils包,其中包括许多计算任务的功能方法,如集成和最小化.
好问题!
几年来,我一直是该领域为数不多的先驱者之一,而且我们最近才达到了能够同时获得类似Fortran性能和类似Python的简洁性以解决各种问题的程度.在详细研究了所有可用的函数语言及其实现之后,我决定将我的工作重点放在静态类型的不纯函数语言上:开源OCaml编程语言和Microsoft的 .NET F#编程语言.
我的书" OCaml for Scientists"使用Linux或Mac OS X 的OCaml编程语言来介绍科学计算.我的书F#for Scientists使用Microsoft的F#编程语言使用Windows和Visual Studio进行科学计算.我公司还销售F#for Numerics和F#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倍.