1. ホーム
  2. haskell

[解決済み] 関数型プログラミングにおける「reify」「reification」の意味とは?

2023-05-16 16:18:23

質問

この用語は、haskellや関数型プログラミングに関するブログでよく見かけます(特に sigfpeのブログ で)よく読むのですが、どういう意味なのかさっぱりわかりません。ほとんどの場合、知らないで済ませていますが、もし知っていたら、おそらくもっとよく文章を理解できたでしょう。Googleは私を助けてはくれなかった。技術的なことで迷ってしまうのです。

また、技術的でない世界の意味("turning the abstract concrete")は、コードで何かを再定義することが実質的に何を意味するのかを理解する助けにならない。

私はコンピュータサイエンスの概念に鈍いので、コードによる実用的な例があるとうれしいです :P

どのように解決するのですか?

ということで、読んでみると、結構、「抽象的な概念を具体化する」ということですね。あるいは、抽象的な概念を表現する代理人が存在する。例えば、Lispでは、ラムダを使うと、手続きの抽象化と応用の概念が再定義されます。

再定義はそれ自体が広い概念であり、関数型プログラミング言語だけに適用されるものではありません。

例えばJavaでは、実行時に利用可能な型があります。これらは再定義可能な型です。つまり、実行時に型の抽象的な概念を具体的に表現するものが存在するのです。これに対して、Reifiableでない型もある。これは、特にJavaでジェネリクスを使用する際に顕著に現れる。Javaでは、ジェネリックスは型消去の対象となるため、ジェネリックスの型情報は(パラメータ化された型が無限のワイルドカードを使用しない限り)実行時には利用できない。

もう一つの例は、概念をモデル化しようとするときです。例えば Group クラスがあり User クラスがあります。さて、この2つの関係を表す抽象的な概念があります。例えば、抽象的な概念である User のメンバーであることは Group . この関係を具体化するために isMemberOf というメソッドを書いて UserGroup . つまり、あなたがここで行ったことは ということです。 (を現実化/明示化/具体化したことです。 抽象概念 を実現した。

もう一つの良い例は、オブジェクトの間に親子関係があるデータベースです。この関係を記述するには 抽象概念 で表現できます。さて、データベースからこのデータを取得して 実際の Tree オブジェクトを作成します。今あなたがしたことは に変更されました。 であり、親子というツリー状の関係という抽象的な概念を 実際の Tree オブジェクトになります。

関数型言語一般に話を戻すと、おそらく再定義の最も良い例はプログラミング言語Lispの作成そのものでしょう。Lispは完全に抽象的で理論的な構成物でした(基本的にはコンピュータ言語のための数学的記法に過ぎません)。それは、Lispの eval 関数が Steve Russel によって IBM 704 上で実際に実装されるまで、その状態が続きました。

Hackers & Painters, p. 185 で Paul Graham が報告した内容によると、McCarthy は次のように述べています: "Steve Russell は言った、見て、なぜこの eval をプログラムしないのか...、私は彼に言った、ホー、ホー、あなたは理論を実践と混同しています、この eval は読むためのもので計算用ではないです。しかし、彼はそれを実行に移したのです。つまり、彼は私の論文のevalをIBM 704のマシンコードにコンパイルしてバグを修正し、これをLispインタプリタとして宣伝したのですが、それは確かにそうでした。つまり、その時点でLispは本質的に今日のような形になっていたのです...。

つまり、Lisp は に変更されました。 を抽象的な概念から実際のプログラミング言語にしたのです。