(機能的?)プログラミングの文脈で「具体化」と「具体化」はどういう意味ですか?


82

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

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

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

回答:


42

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

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

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

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

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

一般的な関数型言語に戻ると、おそらく具体化の最良の例は、Lispプログラミング言語自体の作成です。Lispは完全に抽象的で理論的な構成概念でした(基本的にはコンピュータ言語の数学表記です)。Lispのeval機能が実際にSteveRusselによってIBM704に実装されるまで、このままでした。

ハッカーと画家のポール・グラハムによって報告されたものによると、p。185、マッカーシーは言った:「スティーブ・ラッセルは言った、見て、なぜ私はこの評価をプログラムしないのか...そして私は彼に言った、ホー、ホー、あなたは理論と実践を混同している、この評価は読むことを意図しているのではなくしかし、彼は先に進んでそれを実行しました。つまり、彼は私の論文のevalをIBM 704マシンコードにコンパイルし、バグを修正してから、これをLispインタープリターとしてアドバタイズしました。本質的には今日の形です...」

だから、Lispのをして具体化実際のプログラミング言語に、抽象的な概念から。  


2
状況によっては、具体化が連続して存在しているようです。抽象Lispはプログラミング言語に具体化されましたが、プログラミング言語自体は計算を伝達するかなり抽象的な概念形式であり、さらに機械語に具体化され、最後に1、0、最後に電気信号に具体化される必要があります...などしたがって、具体化は抽象化の正反対(二重)です。
CMCDragonkai 2014年

25

具象化

具象化はインスタンス化の一形態です。概念を具体化するときは、提供した辞書の定義と同じように、抽象的なものを取り入れて具体的にします。

可能な型のいくつかの抽象構文木に生息する用語として型を具体化することを選択するかもしれません。

いくつかの言語での汎用実装を考え出すことで、デザインパターンを具体化することができます。たとえば、

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

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

シングルトンデザインパターンをC ++のテンプレートとして具体化します。

Hoareのクイックソートのアイデアを、選択したプログラミング言語の実装に具体化することができます。このように、私は圏論からHaskellコードへの概念の具体化に多くの時間を費やしています。

言語をその言語の通訳として具体化することができます。Larry WallのPerlの考え方は、perlインタープリターとして洗練されています。

データ具体化し、真空パッケージは、それが共有してメモリ内に構成されている方法を表すグラフとして用語を具体化。

反射

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

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

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

(より正式には、リフレクションを具体的なドメインから抽象的なドメインに移動する忘却関手と見なす場合、具体化は理想的にはリフレクションに隣接したままになります。)

反射私は保守パッケージは、あなたが新しい用語を生成することができます方法を反映して、用語を取り、それを表しタイプを生み出す具体化する方法を提供します。ここで、「具体的な」ドメインは型システムであり、抽象的なドメインは用語です。


21

Haskell Wikiから:

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

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


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


9

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

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


2

RDFには具体化の概念があることを私は知っています。ティム・バーンズリーで述べました

この文脈での具体化とは、その言語を使用して言語で何かを表現することを意味し、その結果、その言語で処理できるようになります。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.