[解決済み] 関数型プログラミングにおける「reify」「reification」の意味とは?
質問
この用語は、haskellや関数型プログラミングに関するブログでよく見かけます(特に sigfpeのブログ で)よく読むのですが、どういう意味なのかさっぱりわかりません。ほとんどの場合、知らないで済ませていますが、もし知っていたら、おそらくもっとよく文章を理解できたでしょう。Googleは私を助けてはくれなかった。技術的なことで迷ってしまうのです。
また、技術的でない世界の意味("turning the abstract concrete")は、コードで何かを再定義することが実質的に何を意味するのかを理解する助けにならない。
私はコンピュータサイエンスの概念に鈍いので、コードによる実用的な例があるとうれしいです :P
どのように解決するのですか?
ということで、読んでみると、結構、「抽象的な概念を具体化する」ということですね。あるいは、抽象的な概念を表現する代理人が存在する。例えば、Lispでは、ラムダを使うと、手続きの抽象化と応用の概念が再定義されます。
再定義はそれ自体が広い概念であり、関数型プログラミング言語だけに適用されるものではありません。
例えばJavaでは、実行時に利用可能な型があります。これらは再定義可能な型です。つまり、実行時に型の抽象的な概念を具体的に表現するものが存在するのです。これに対して、Reifiableでない型もある。これは、特にJavaでジェネリクスを使用する際に顕著に現れる。Javaでは、ジェネリックスは型消去の対象となるため、ジェネリックスの型情報は(パラメータ化された型が無限のワイルドカードを使用しない限り)実行時には利用できない。
もう一つの例は、概念をモデル化しようとするときです。例えば
Group
クラスがあり
User
クラスがあります。さて、この2つの関係を表す抽象的な概念があります。例えば、抽象的な概念である
User
のメンバーであることは
Group
. この関係を具体化するために
isMemberOf
というメソッドを書いて
User
が
Group
. つまり、あなたがここで行ったことは
ということです。
(を現実化/明示化/具体化したことです。
抽象概念
を実現した。
もう一つの良い例は、オブジェクトの間に親子関係があるデータベースです。この関係を記述するには
抽象概念
で表現できます。さて、データベースからこのデータを取得して
実際の
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 は に変更されました。 を抽象的な概念から実際のプログラミング言語にしたのです。
関連
-
[解決済み] リフレクションとは何か、なぜ有用なのか?
-
[解決済み] JSONPとは何か、なぜ作られたのか?
-
[解決済み] MVPとMVC、その違いは何ですか?
-
[解決済み] メソッドと関数の違いは何ですか?
-
[解決済み] Subversionリポジトリにおける「branch」、「tag」、「trunk」の意味とは?
-
[解決済み] (関数型)リアクティブプログラミングとは?
-
[解決済み] 関数型プログラミングで時間関数が存在するのはなぜですか?
-
[解決済み】関数型プログラミングはGoFデザインパターンに取って代わるか?
-
[解決済み] 制約条件付き特殊化
-
[解決済み] モナドが合成の下では閉じていないことを示す具体例(証明付き)?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Haskellで "length "関数を使用しない場合のリストの長さ
-
[解決済み] Haskell における `mod` と `rem` の違い
-
[解決済み] Haskellのリストを参照する際の「@」記号の意味は?
-
[解決済み] Haskellでメモ化?
-
[解決済み] Haskellでグラフはどのように表現するのか?
-
[解決済み] Haskellはガベージコレクタを必要としますか?
-
[解決済み] Haskellってなんで流行ってるの?[クローズド]
-
[解決済み] fixの使い方、効果について教えてください。
-
[解決済み] このHaskellのコードはなぜ-Oをつけると遅くなるのですか?
-
[解決済み] なぜStringを型クラスのインスタンスにできないのですか?