26

関数型プログラミング言語で作成された本格的な科学数学ライブラリはありますか? 関数型言語の性質から、関数型言語は特に数学に適していると思われますが、よく知られているアルゴリズムは手続き型のようです。

たとえば、古典的なNumerical Recipesシリーズはほとんど手続き型で書かれています。LAPACKは多くの分野でほぼ事実上の標準ですが、Fortran であるため手続き型またはオブジェクト指向ですが、機能的ではありません。

この種のよく知られた手続き型アルゴリズムを関数型スタイルに変換できた人はいますか?

更新: Mathematica などの記号計算で関数型言語が使用されているようです。しかし、数値計算や関数型アルゴリズムと本質的に互換性のないものはありますか? それとも、たまたま命令型アルゴリズムが最初に発明されたために、機能的に等価なアルゴリズムを思いつく人が誰もいなかったということですか?

4

7 に答える 7

24

hackageDB には数値用の Haskell ライブラリがあります: hmatrix。LAPACK、BLAS、および GSL (GNU Scientific Library) から描画されます。

ただし、命令型アルゴリズムは、モナド (より具体的には状態変換子) を使用して純粋関数型言語に簡単に変換できることを覚えておく必要があります。実際、効率的なインプレース実装では、通常、このようなメカニズムを使用して、純粋関数型言語で変更可能な変数を提供する必要があります。

機能的なスタイルを踏襲することは、多くの場合不可能です。多くの問題について、既知の (効率的な) 機能的アプローチはありません。もちろん、そのようなアルゴリズムをたとえば Haskell で動作させることはできますが、Matlab、Fortran、または C で記述された場合とあまり変わらないように見えます。

編集:

これは明らかな非互換性であると同時に、最初に発生した問題でもあります。

  1. 通常、効率的な数値アルゴリズムには可変データが必要です。これは純粋に機能的な設定では可能ですが、命令型言語ほど簡単ではありません。しかし、2 つの計算モデルは完全に同等です。
  2. 基礎となるマシン (例: 命令セット) は常に必須であり、例外はほとんどありません (!)。実際のマシンがモデル化される方法を考えると、命令型にコーディングされたアルゴリズムは分析と最適化が容易です。
  3. 基礎となる数学により関数解を比較的簡単に導出できますが、効率的なアルゴリズムは得られません (数学から命令解を直接導出する場合と同様)。ほとんどの努力はこれまでも今も命令的な解決策に向けられているため、機能的な解決策はまったく知られていません。機能的な対応物とは、機能的な意図とスタイルを適切に表現するコードを意味します。
  4. 再利用できる命令型コードはたくさんあります。その多くは、状態トランスフォーマーを使用して関数型言語に変換できますが、それでも必須に見えます。

実際、Haskell のような純粋関数型言語は、アルゴリズムのコーディングに有益であると考えています。数学的な記述、アルゴリズム自体、ある種の型指向の証明 (つまり、Curry-Howard isomorphismを使用) をコードの同じチャンクに統合できます。 .

于 2009-06-08T18:45:17.570 に答える
7

LAPACKを書き直そうとするのではなく、関数型言語のブラックボックスとして使用します。LAPACKは、何十年にもわたって非常に賢い人々によってテスト、微調整、最適化などされてきました。私はそれに触れないでしょう。

于 2009-06-08T22:20:44.547 に答える
5

素晴らしい質問です!

私はここ数年、この分野の数少ないパイオニアの 1 人であり、広範囲の問題に対して Fortran のようなパフォーマンスと Python のような簡潔さを同時に実現できるようになったのはごく最近のことです。利用可能なすべての関数型言語とその実装を詳細に調べた結果、静的に型付けされた非純粋な関数型言語 (オープン ソースのOCaml プログラミング言語とMicrosoft の.NET 用プログラミング言語 F# ) に力を注ぐことにしました。

私の本OCaml for Scientistsでは、Linux または Mac OS X を使用したOCaml プログラミング言語による科学計算について説明しています。私の本F# for Scientistsでは、Windows と Visual Studio を使用したMicrosoft の F# プログラミング言語による科学計算について説明しています。私の会社では、完全に F# で記述された F # for NumericsおよびF# for Visualizationライブラリも販売しており、簡潔さ、明快さ、および保守性を向上させるために内部的に、またライブラリを使いやすくするために外部的にも関数型プログラミングを広範に使用しています。たとえば、一級関数を使用すると、正弦関数をプロットするなど、非常に簡単にグラフをプロットできます。

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

F# for Visualization は、任意精度の有理数の行列を与えることができるように、任意の型の任意の値を視覚化しようとし、結果を typeset mathematics として表示します。

私たちは、OCaml 言語と F# 言語の両方で、科学計算用のコードを関数型スタイルで書くことに大きな成功を収めてきました。特に、F# を使用すると、抽象化によってパフォーマンスが低下することなく、汎用的な高性能並列コードを簡単に記述できます。そのため、あらゆるタイプ (単精度、倍精度、複素数、さらにはシンボリック!) の行列に対して機能する QR 分解を実装でき、Intel MKL などのベンダー調整ライブラリのパフォーマンスを打ち負かすことさえできます!

最後に、Mathematica は私よりずっと前にこの道を切り開いたことに注意してください。しかし、彼らの解決策は、C で書かれた数値関数と記号関数の巨大な標準ライブラリを従来の命令型スタイルと組み合わせ、それらの関数を呼び出すためのかなり初歩的な関数型プログラミング言語を提供することでした。彼らのアプローチの主な欠点は、Mathematica で書かれた一般的なコード (つまり、標準ライブラリにほとんど時間が費やされていないコード) は、C よりも約 1,000 倍遅いことです。

于 2009-07-31T13:42:46.253 に答える
4

いくつかのコンピューター代数システム (Maxima など) は、LISP ベースの言語を内部的に利用して、シンボリック計算/構文ツリーを表現しています。

数学的、関数型言語の例:

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

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

とにかく、関数型スタイルではうまく定式化できない、または効率的でない、いくつかの数学的問題とアルゴリズムがあります。効率的な実装は常に不可欠です。例:エラトステネスのふるい

于 2009-06-08T18:50:36.110 に答える
3

「深刻」を定義します。関数型言語 (LISP 以外) はかなり新しいものであることを思い出してください — Backes の最初の論文は 70 年代後半にさかのぼり、生産工学関数型言語はまったく新しいものです。よく知られて受け入れられている数値パッケージはすべて、60 年代後半から 70 年代前半に始まったアルゴリズムとコードに基づいています — BLASが最初に公開されたのは 1979 年です。 、古いFORTRANコードへの主要なドライブがあります。

しかし、関数型言語で数値処理をしている人は確かにいます。別の回答で指摘されているように、 Mathematica はますます関数数値言語になり、ますますそれ自体で実装されています。

于 2009-06-08T18:58:00.150 に答える
3

Mathematica は独自の関数型言語を利用していると思います.

于 2009-06-08T18:35:58.323 に答える