web-dev-qa-db-ja.com

(関数化)プログラミングのコンテキストで「具体化」と「具体化」は何を意味しますか?

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

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

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

79

だから私はこれについて読みました、そしてそれはそれが何を意味するかということです:抽象的な概念を取り、それを具体化すること。または、抽象的な概念を表すプロキシがあります。たとえば、LISPでは、ラムダを使用すると、プロシージャの抽象化とアプリケーションの概念が具体化されます。

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

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

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

別の良い例は、オブジェクト間に親子関係があるデータベースです。この関係は、ツリーの抽象的な概念で説明できます。次に、データベースからこのデータを取得し、actualTreeオブジェクトを作成する関数/メソッドがあるとします。これでreified親子ツリーのような関係の抽象的な概念がactualTreeオブジェクトになりました。

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

Paul GrahamのHackers&Painters、p。 185、マッカーシーは言った:「スティーブ・ラッセルが言った、見て、なぜ私はこの評価をプログラムしないのか...そして私は彼に言った、ほらほら、あなたは理論を実践と混同している、この評価は読むことを意図しているのではなく、つまり、彼は私の論文の評価をIBM 704マシンコードにコンパイルし、バグを修正してから、これをLISPインタープリターとして宣伝しました。基本的に、今日の形... "

したがって、LISPはreifiedであり、抽象的な概念から実際のプログラミング言語へと変わりました。

37
Vivin Paliath

具体化

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

型を、可能な型の抽象的な構文ツリーに存在する用語として具体化することを選択できます。

ある言語用に汎用的な実装を考え出すことで、デザインパターンを具体化できます。たとえば、次のようなもの

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

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

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

Hoareのクイックソートのアイデアを、選択したプログラミング言語の実装に具体化できます。この流れで、カテゴリー理論からHaskellコードに概念を具体化するのに多くの時間を費やしています。

言語をその言語のインタープリターとして具体化できます。ラリー・ウォールのアイデア Perl 言語はPerlインタプリタとして具現化されています。

data-reify および vacuum パッケージは、メモリ内での共有の構造を表すグラフとして用語を具体化します。

反射

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

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

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

(より正式には、リフレクションを、具体的なドメインから抽象的なドメインに導く忘れがたいファンクターと見なす場合、具体化は、理想的には、リフレクションに随伴します。)

私が管理している reflection パッケージは、用語を取得してそれを表すタイプを生成するreifyメソッドを提供し、次に新しい用語を生成するReflectメソッドを提供します。ここで、「具体的な」ドメインは型システムであり、抽象的なドメインは用語です。

24
Edward KMETT

Haskell Wiki から:

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

具象化されたタイプは、タイプを表す値です。実際の型の代わりに具体化された型を使用するということは、値を使ってできるのと同じように、それらを使ってどんな操作もできるということです。

21
Kynth

私が思いつく用途の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を渡すだけで、..ByなどのData.List.nubBy関数を取得できます。Ordの同様のトリックはData.List.sortBy

14
yatima2975

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

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

9
sclv

RDFには具体化の概念があることは知っています。として Tim Bernes-Leeにより記載

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

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

2
M. Dudley