85

Haskellと関数型プログラミングに関するブログ(特にsigfpeのブログ)でこの用語をよく読んでいますが、それが何を意味するのかわかりません。ほとんどの場合、それを知らなくても大丈夫ですが、知っていれば、テキストをもっとよく理解できたでしょう。Googleは私を助けませんでした。私は技術的なもので迷子になります。

また、世界の非技術的な意味(「抽象的対象を変える」)は、コードで何かを具体化することが実際に何を意味するのかを理解するのに役立ちません。

私はコンピュータサイエンスの概念が少し遅いので、コードを使った実用的な例がいいでしょう。:P

4

6 に答える 6

47

だから私はこれを読みました、そしてそれはほとんどそれが意味することです: 抽象的な概念を取り、それを具体的にする. または、抽象的な概念を表すプロキシがあります。たとえば、Lisp では、ラムダを使用すると、手続きの抽象化と適用の概念が具体化されます。

具体化自体は幅広い概念であり、関数型プログラミング言語だけに適用できるわけではありません。

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

もう 1 つの例は、概念をモデル化しようとする場合です。たとえば、GroupクラスとクラスがあるとしますUser。現在、両者の関係を説明する特定の抽象的な概念があります。たとえば、 aUserが a のメンバーであるという抽象的な概念Group。この関係を具体的にするには、 aが a のメンバーであるisMemberOfかどうかを示すというメソッドを記述します。つまり、ここで行ったことは、グループ メンバーシップの抽象的な概念を具体(現実的/明示的/具体的に) したことです。UserGroup

もう 1 つの良い例は、オブジェクト間に親子関係があるデータベースです。この関係は、ツリーの抽象的な概念で説明できます。ここで、データベースからこのデータを取得して実際の Treeオブジェクトを構築する関数/メソッドがあるとします。これで、親子ツリーのような関係の抽象的な概念が実際 Treeオブジェクトに具体化されました。

一般的な関数型言語に戻ると、おそらく具体化の最も良い例は、Lisp プログラミング言語自体の作成です。Lisp は、完全に抽象的で理論的な構成要素でした (基本的には、コンピューター言語の数学的な表記法にすぎません)。evalLisp の関数が IBM 704 で Steve Russel によって実際に実装されるまで、それはそのままでした。

Hackers & Painters で Paul Graham が報告した内容によると、p. 185、McCarthy は次のように述べています。計算のために. しかし彼は先に進みました. つまり, 彼は私の論文の eval を IBM 704 マシンコードにコンパイルし, バグを修正し, そしてこれを Lisp インタプリタとして宣伝しました. それは確かにそうでした.基本的に今日の形...」

そのため、 Lisp は抽象的な概念から実際のプログラミング言語に具体化されました。  

于 2011-03-15T17:18:06.950 に答える
28

具体化

Reification is a form of instantiation. When you reify a concept, you take something abstract and make it concrete, just like the dictionary definition you provided.

You might choose to reify a type as a term inhabiting some abstract syntax tree of possible types.

You might reify a design pattern by coming up with a general purpose implementation of it for some language. For instance, something like

template<typename T> class Singleton {
    public:
        static T& Instance() {
            static T me;
            return me;
        }

    protected:
       virtual ~Singleton() {};
       Singleton() {};
}

reifies the singleton design pattern as a template in C++.

You can reify Hoare's idea of quicksort into an implementation in the programming language of your choice. In this vein, I spend a lot of time reifying concepts from category theory into Haskell code.

You can reify a language as an interpreter for that language. Larry Wall's idea of Perl the language is reified as the perl interpreter.

data-reifyおよびvacuumパッケージは、用語を共有してメモリ内でどのように構造化されているかを表すグラフとして具現化します。

反射

具体化の反対側はリフレクションであり、具体的なものを取り、通常は詳細を忘れることによって抽象化を生成します。おそらく、抽象化がより単純であるか、または話していることの本質を何らかの形で捉えているため、これを行いたいと思うでしょう。

Java、C# などの型システム リフレクションは、プログラミング言語の具体的なクラスを取り、クラスの抽象構造を提供して、クラスが提供するメンバーのリストにアクセスできるようにします。ここでは、型の具体的な概念を取り、特定の値を破棄しながら、その構造を説明する抽象用語をそこから生成しています。

プログラミング言語を実装に具体化する方法と同様に、逆の方向に進む場合もあります。これは一般的に悪い考えと考えられていますが、実装を取り、その動作の望ましい特性から言語仕様を反映しようとするかもしれません。TeX は、Knuth によって最初に実装されましたが、仕様はありません。TeX のすべての仕様は、Knuth の実装から反映されています。

(より形式的には、具体的な領域から抽象的な領域へと移動する忘却関手としてリフレクションを考える場合、具体化は、理想的には、リフレクションの随伴性のままにされます。)

私が維持しているリフレクションパッケージは、用語を受け取り、それを表す型を生成する reify メソッドと、新しい用語を生成できる Reflect メソッドを提供します。ここで、「具体的な」ドメインは型システムであり、抽象的なドメインは用語です。

于 2011-03-15T18:04:28.517 に答える
21

Haskell Wikiから:

何かを「具体化する」とは、抽象的なものを物質的なものと見なすことです。古典的な例は、古代人が抽象的な概念 (例えば「勝利」) を取り、それらを神 (例えば、ギリシャの勝利の女神ニケ) に変えた方法です。

具体化された型は、型を表す値です。実際の型の代わりに具体化された型を使用するということは、値で実行できる操作をそれらで実行できることを意味します。

于 2011-03-15T17:08:52.027 に答える
15

私が思いつく 1 つの用途 (他にもあるはずです!) は、クラスを辞書に変換することです。クラスを見てみましょう(今のところ演算子はEq忘れてください):/=

class Eq a where
    (==) :: a -> a -> Bool

このクラスを具体化すると、次のようになります。

data EqDict a = EqDict (a -> a -> Bool)

構築、検査などを行うことができます。Eqまた、型ごとに1 つのインスタンスしか持てませんが、複数のEqDict値を持つことができることも注目に値します。しかし、インスタンスの自動構築 (たとえば、要素に対してリストがある場合にリストに対して同等性を取得する) は機能しません。EqDict [a]自分で値を構築する必要があります。

具体化プロセスは次のように単純です (この場合)。

reify :: Eq a => EqDict a
reify = EqDict (==)

クラスを使用する関数は、次のEqように変換できます。

-- silly example, doesn't really do anything
findMatches :: Eq a => a -> [a] -> [a]
findMatches x ys = [ y | y <- ys, x == y ]

-- version using EqDict
findMatchesDict :: EqDict a -> a -> [a] -> [a]
findMatchesDict (EqDict f) x ys = [ y | y <- ys, f x y ]

EqDict をアンラップして を渡すだけで、 や フレンドなどの関数a -> a -> Boolが得られます - へのリードの同様のトリックです。..ByData.List.nubByOrdData.List.sortBy

于 2011-03-15T17:16:59.087 に答える
9

Haskell のコンテキストだけでも、この用語は非常に広く使用されています。Andy Gill の reify パッケージを使用すると、再帰的な構造を取り、それらを明示的なグラフに変換できます。継続に関する Sigpfe の投稿では、「残りの計算」の概念を、受け渡し可能な値に具体化する方法について説明しています。テンプレート Haskell には、Haskell 値の名前を指定すると、それに関する利用可能な情報 (宣言されている場所、型など) を返す reify 関数 (一般に、コンパイル時に TH コードと共に実行される) があります。

これらすべてのケースに共通するものは何ですか? 彼らは、私たちが推論して知ることはできるが、プログラムで直接操作できないものを取り、それを他のものと同じように名前を付けて渡すことができる実際のファーストクラスの値に変換することについて話している. そして、それは一般に、人々が言葉を使用するときに伝えたい意図です.

于 2011-03-15T17:46:55.500 に答える
3

RDF には具象化の概念があることは知っています。Tim Bernes-Lee が述べたように:

この文脈における具象化とは、その言語を使用してその言語で何かを表現することを意味し、その言語によって処理可能になります。

それは反省や内省のようなものだと思います。ここで良い答えが得られることを願っています!

于 2011-03-15T17:13:14.920 に答える