79 votes

Que signifient "réifier" et "réification" dans le contexte de la programmation (fonctionnelle?)?

J'ai lu ce terme a beaucoup de blogs sur haskell et programmation fonctionnelle (spécialement dans sigfpe du blog) mais je n'ai pas la moindre idée de ce que cela signifie. Je m'en sors pas le savoir la plupart du temps, mais j'aurais probablement compris les textes beaucoup mieux si je savais. Google ne m'aide pas. Je me suis perdu dans les trucs techniques.

Aussi le non-sens technique du monde ("le tournant de l'abstrait concret") ne m'aide pas à comprendre ce que cela signifie pratiquement à concrétiser quelque chose dans le code.

Je suis un peu lent avec ordinateur les concepts de la science, donc, des exemples concrets avec le code, ce serait bien. :P

38voto

Vivin Paliath Points 40975

Donc, j'ai lu, et c'est à peu près ce que cela signifie: prendre un concept abstrait, et de le rendre concret. Ou, il y a un proxy qui représente le concept abstrait. Par exemple, en Lisp, la notion de procédure de l'abstraction et de l'application est réifiée lorsque vous utilisez les lambdas.

La réification par lui-même est un concept large et pas seulement applicable à la programmation fonctionnelle-langues.

En Java par exemple, il y a des types qui sont disponibles au moment de l'exécution. Ce sont reifiable types. Sens, il existe une représentation concrète de la notion abstraite de la nature, au cours de l'exécution. En revanche, il y a des non-reifiable types. C'est particulièrement évident lors de l'utilisation de médicaments génériques en Java. En Java, les génériques sont soumis à type d'effacement, et donc de type générique-l'information n'est pas disponible au cours de l'exécution (sauf si le type paramétré utilise illimitée des caractères génériques).

Un autre exemple est lorsque vous essayez d'modèle d'un concept. Par exemple, supposons que vous avez un Group de la classe et un User classe. Maintenant, il y a certains concepts abstraits qui décrivent la relation entre les deux. Par exemple, le concept abstrait d'un User du fait d'être membre d'un Group. Pour que cette relation de béton, vous devez écrire une méthode appelée isMemberOf qui dit que si un User est membre d'un Group. Donc, ce que vous avez fait ici, c'est que vous avez réifiée (fait réel/explicite/béton) le concept abstrait de l'appartenance à un groupe.

Un autre bon exemple est une base de données où vous avez des relations parent-enfant entre les objets. Vous pouvez décrire cette relation dans le concept abstrait d'un arbre. Maintenant, supposons que vous disposez d'une fonction/méthode qui prend ces données à partir de la base de données et crée un réel Tree objet. Ce que vous avez fait est réifiée de la notion abstraite de la relation parent-enfant en forme d'arbre de la relation dans une réelle Tree objet.

Retour aux langages fonctionnels, en général, peut-être le meilleur exemple de la réification est la création de l'Lisp, langage de programmation lui-même. Lisp a été complètement abstraite et de la construction théorique (fondamentalement juste une notation mathématique pour l'informatique langues). Il est resté ainsi jusqu'à ce que Lisp est eval fonction a été effectivement mis en œuvre par Steve Russel sur un IBM 704:

Selon ce qu'a rapporté par Paul Graham dans Pirates & des Peintres, des p. 185, McCarthy a dit: "Steve Russell a dit, regardez, pourquoi n'ai-je pas le programme de cette eval..., et je lui ai dit, ho, ho, vous êtes à la confusion de la théorie avec la pratique, cette eval est destiné à la lecture, pas pour l'informatique. Mais il est allé de l'avant et il l'a fait. C'est, il a compilé les eval dans mon papier dans IBM 704 du code machine, la fixation d'un bug , et ensuite annoncé cela comme un interpréteur Lisp, c'était certainement le cas. Donc, à ce point de Lisp a essentiellement la forme qu'il a aujourd'hui..."

Donc Lisp a été réifiée d'un concept abstrait, en un véritable langage de programmation.

24voto

Edward Kmett Points 18369

La réification

La réification est une forme de l'instanciation. Lorsque vous concrétiser un concept, vous prenez quelque chose d'abstrait et de le rendre concret, tout comme la définition du dictionnaire que vous avez fournis.

Vous pouvez choisir de concrétiser un type comme un terme qui habitent certains arbre de syntaxe abstraite de types possibles.

Vous pourriez concrétiser un modèle de conception par venir avec un objectif général de mise en œuvre pour certaines langues. Par exemple, quelque chose comme

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

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

réifie le modèle de conception singleton comme un modèle en C++.

Vous pouvez réification Hoare l'idée de quicksort dans la mise en œuvre dans le langage de programmation de votre choix. Dans cette veine, je passe beaucoup de temps chosification des concepts à partir de la catégorie de la théorie du code Haskell.

Vous pouvez réification d'une langue comme d'un interprète pour la langue. Larry Wall idée de Perl la langue est réifiée que l'interpréteur perl.

Les données réification et de vide paquets réification des termes sous forme de graphiques représentant la façon dont il est structuré en mémoire avec le partage.

La réflexion

Le revers de la médaille de la réification est une réflexionqui prend quelque chose de concret, et génère une abstraction, généralement par l'oubli de certains détails. Peut-être vous voulez faire cela, parce que l'abstraction est plus simple, ou en quelque sorte capture l'essence de ce dont vous parlez.

Type de système de réflexion en Java, C#, etc. prend un béton de classe dans un langage de programmation, et vous fournit la structure abstraite une classe, vous donnant accès à la liste de ce que les membres de vos classes. Ici, nous prenons la notion concrète d'un type, et la production d'un terme abstrait qui décrit sa structure, et de rejeter toutes les valeurs particulières.

Comme la façon dont vous pouvez concrétiser un langage de programmation dans une application, vous pouvez quelques fois aller dans la direction opposée. Si cela est généralement considéré comme une mauvaise idée, vous pourriez prendre une mise en œuvre et d'essayer de réfléchir un langage de spécification de l'propriétés souhaitables de son comportement. TeX a été d'abord mises en œuvre par Knuth, sans spécification. Toute spécification de TeX a été traduit à partir de Knuth est mise en œuvre.

(Plus formellement, si vous affichez la réflexion en tant que oublieux foncteur qui vous transporte d'un béton de domaine à un résumé de domaine, puis de la réification, de préférence, gauche adjoint à la réflexion.)

La réflexion paquet-je maintenir fournit une réification méthode qui prend un terme et les rendements d'un type qui la représente, puis une méthode reflect, qui vous permet de générer un nouveau terme. Ici, le "concret" de domaine est le système de type, et l'abrégé de domaine sont des termes.

21voto

Kynth Points 1498

À partir du Haskell documentation:

"Réification" quelque chose est à prendre quelque chose qui est abstrait et à l'égard il comme matériel. Un exemple classique est la façon dont les anciens ont pris les concepts abstraits (par exemple, "la victoire") et transformé en des divinités (par exemple Nike, la déesse grecque de la victoire).

Un réifiée type est une valeur qui représente un type. À l'aide de réifiée types au lieu de types real signifie que vous pouvez faire toutes les manipulations avec eux que vous pouvez faire avec des valeurs.

14voto

yatima2975 Points 4191

Une utilisation que je pense (je suis sûr qu'il y a d'autres!) est en train de tourner une classe dans un dictionnaire. Prenons l' Eq de la classe (en oubliant l' /= - opérateur pour le moment):

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

Si nous réification de cette classe, il devient:

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

qui peut être construit, inspecté et ainsi de suite. Il est également à noter que vous pouvez avoir un seul Eq exemple par type, mais plusieurs EqDict valeurs. Mais la construction automatique d'instances (par exemple l'obtention de l'égalité pour les listes quand vous en avez un pour les éléments) ne fonctionne pas; vous aurez à construire l' EqDict [a] de la valeur vous-même.

La chosification processus est aussi simple que cela (pour ce cas):

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

Une fonction à l'aide de l' Eq d'une classe pourrait transformer quelque chose comme ceci:

-- 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 ]

Si vous déroulez le EqDict et juste passer un a -> a -> Bool, vous obtenez l' ..By fonctions, comme Data.List.nubBy et les amis - une astuce similaire pour Ord entraîne Data.List.sortBy.

9voto

sclv Points 25335

Même dans le contexte d'Haskell, le terme est utilisé de façon très large. Andy Gill de la réification permet de prendre structures récursives et de les transformer en explicite les graphiques. Sigpfe post sur les continuations décrit chosification de la notion du "reste du calcul" dans une valeur que vous pouvez passer. Modèle Haskell a une réification de la fonction (exécutée, avec le code en général, au moment de la compilation) que lorsque le nom d'un Haskell valeur renvoie les informations disponibles sur celui-ci (où a déclaré, type, etc.).

Que faire de tous ces cas ont en commun? Ils parlent de prendre quelque chose que nous pouvons comprendre et de savoir, mais que nous ne pouvons pas directement manipuler par programmation, et de la transformer en une véritable première classe de la valeur que l'on peut nommer et de faire passer comme toutes les autres. Et c'est généralement l'intention que les gens veulent transmettre quand ils utilisent le mot.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X