Article de reference

curry

cela prend deux arguments, un de X {\displaystyle X} et un de Y , {\displaystyle Y,} et produit des objets dans Z . {\displaystyle Z.} La forme curryfiée de cette fonction trait...

cela prend deux arguments, un de

Dans cet exemple,

La curryfication est liée à l'application partielle , mais n'est pas identique . L'exemple ci-dessus peut être utilisé pour illustrer l'application partielle ; il est assez similaire. L'application partielle est la fonction

La curryfication d'une fonction ayant plus de deux arguments peut être définie par induction.

La curryfication est utile tant sur le plan pratique que théorique. Dans les langages de programmation fonctionnelle , et dans bien d'autres, elle permet de gérer automatiquement le passage des arguments aux fonctions et aux exceptions . En informatique théorique , elle permet d'étudier les fonctions à plusieurs arguments dans des modèles théoriques plus simples qui n'en prennent qu'un seul. Le cadre le plus général pour la notion stricte de curryfication et de décurryfication se trouve dans les catégories monoïdales fermées , ce qui sous-tend une vaste généralisation de la correspondance de Curry-Howard entre les preuves et les programmes, en une correspondance avec de nombreuses autres structures, notamment la mécanique quantique , les cobordismes et la théorie des cordes .

Le concept de curryfication a été introduit par Gottlob Frege , développé par Moses Schönfinkel , et développé plus avant par Haskell Curry .

La désincurration est la transformation duale de la curryfication et peut être considérée comme une forme de défonctionnalisation . Elle prend une fonction

Motivation

La curryfication permet de manipuler des fonctions à plusieurs arguments et de les utiliser dans des contextes où certaines fonctions n'en acceptent qu'un seul. Par exemple, certaines techniques analytiques ne s'appliquent qu'aux fonctions à un seul argument. Or, les fonctions pratiques acceptent souvent plus d'arguments. Frege a démontré qu'il suffisait de proposer des solutions pour le cas d'un seul argument, car il était possible de transformer une fonction à plusieurs arguments en une chaîne de fonctions à un seul argument. Cette transformation est le processus aujourd'hui connu sous le nom de curryfication. Toutes les fonctions « ordinaires » que l'on rencontre généralement en analyse mathématique ou en programmation informatique peuvent être curryfiées. Cependant, il existe des catégories pour lesquelles la curryfication est impossible ; les catégories monoïdales fermées constituent les catégories les plus générales autorisant la curryfication .

Certains langages de programmation utilisent presque systématiquement des fonctions curryfiées pour gérer plusieurs arguments ; ML et Haskell en sont des exemples notables , où toutes les fonctions n'ont qu'un seul argument. Cette propriété est héritée du lambda-calcul , où les fonctions à plusieurs arguments sont généralement représentées sous forme curryfiée.

La curryfication est liée à l'application partielle , mais n'est pas identique . En pratique, la technique de programmation des fermetures peut être utilisée pour effectuer une application partielle et une sorte de curryfication, en cachant les arguments dans un environnement qui voyage avec la fonction curryfiée.

Histoire

Le terme « Curry » dans « curryisation » fait référence au logicien Haskell Curry , qui a largement utilisé ce concept, mais Moses Schönfinkel en avait eu l'idée six ans auparavant. Le terme alternatif « schönfinkelisation » a été proposé. Dans le contexte mathématique, le principe remonte aux travaux de Frege en 1893.

L'origine du terme « currying » est incertaine. David Turner affirme que Christopher Strachey l'a inventé dans ses notes de cours de 1967, * Fundamental Concepts in Programming Languages * , mais cette source présente le concept comme « un procédé créé par Schönfinkel », sans employer le terme « currying », alors que Curry est mentionné plus loin dans le contexte des fonctions d'ordre supérieur . John C. Reynolds a défini le « currying » dans un article de 1972, sans toutefois prétendre en être l'inventeur

Définition

La curryfication se comprend plus facilement en commençant par une définition informelle, qui peut ensuite être adaptée à de nombreux domaines différents. Il convient tout d'abord d'établir une notation.

Étant donné une fonction

curryfication construit une nouvelle fonction

C'est,

pour

Le décurryage est la transformation inverse, et se comprend plus facilement à l'aide de son adjoint à droite, la fonction

théorie des ensembles

En théorie des ensembles , la notation

En effet, c'est cette bijection naturelle qui justifie la notation exponentielle pour l'ensemble des fonctions. Comme c'est le cas dans tous les cas de curryfication, la formule ci-dessus décrit une paire de foncteurs adjoints : pour tout ensemble fixé

Dans la catégorie des ensembles , l' objet

Espaces fonctionnels

Dans la théorie des espaces fonctionnels , comme en analyse fonctionnelle ou en théorie de l'homotopie , on s'intéresse généralement aux fonctions continues entre espaces topologiques . On écrit :toutes les fonctions de

tandis que le décurryage est l'application inverse. Si l'ensemble

est un homéomorphisme . C'est également le cas lorsque

Un corollaire utile est qu'une fonction est continue si et seulement si sa forme curryfiée est continue. Un autre résultat important est que l' application , généralement appelée « évaluation » dans ce contexte, est continue (notez que le terme « évaluation » est un concept strictement différent en informatique). Autrement dit,

est continu lorsque

topologie algébrique

En topologie algébrique , la curryfication est un exemple de dualité d'Eckmann-Hilton et, à ce titre, joue un rôle important dans divers contextes. Par exemple, l'espace des lacets est adjoint aux suspensions réduites ; on écrit généralement ceci comme

A , etA. En substance, la suspension

La dualité entre le cône de cartographie et la fibre de cartographie ( cofibration et fibration ) peut être comprise comme une forme de curryfication, qui à son tour conduit à la dualité des longues séquences Puppe exactes et coexactes .

En algèbre homologique , la relation entre curryfication et décurryfication est appelée adjonction tenseur-hom . Un phénomène intéressant apparaît alors : le foncteur Hom et le foncteur produit tensoriel ne se relèvent pas nécessairement en une suite exacte ; ceci conduit à la définition des foncteurs Ext et Tor .

Théorie des domaines

En théorie de l'ordre , la théorie des treillis d' ensembles partiellement ordonnés ,

La notion de continuité apparaît dans la théorie des types homotopiques , où, en gros, deux programmes informatiques peuvent être considérés comme homotopiques, c'est-à-dire qu'ils calculent les mêmes résultats, s'ils peuvent être refactorisés «continuellement» de l'un à l'autre.

calculs lambda

En informatique théorique , la curryfication permet d'étudier les fonctions à plusieurs arguments dans des modèles théoriques très simples, comme le lambda-calcul , où les fonctions ne prennent qu'un seul argument. Prenons l'exemple d'une fonctionx doit avoir le typey doit avoir le typef est définie comme

L'opérateur → est souvent considéré comme associatif à droite , donc le type de fonction curryfiée

Autrement dit, les parenthèses ne sont pas nécessaires pour lever toute ambiguïté quant à l'ordre de l'application.

Les fonctions curryfiées peuvent être utilisées dans tout langage de programmation prenant en charge les fermetures ; cependant, les fonctions non curryfiées sont généralement préférées pour des raisons d’efficacité, car la surcharge liée à l’application partielle et à la création de fermetures peut alors être évitée pour la plupart des appels de fonction.

Théorie des types

En théorie des types , l'idée générale d'un système de types en informatique est formalisée en une algèbre de types spécifique. Par exemple, lors de l'écriture

L'approche théorique des types est exprimée dans des langages de programmation tels que ML et les langages qui en sont dérivés et qui s'en inspirent : Caml , Haskell et F# .

L'approche typée complète naturellement le langage de la théorie des catégories , comme nous le verrons plus loin. En effet, les catégories, et plus particulièrement les catégories monoïdales , possèdent un langage interne , dont le lambda-calcul simplement typé est l'exemple le plus emblématique. Ce langage est important ici car il peut être construit à partir d'un unique constructeur de type : le type flèche. La curryfication dote alors ce langage d'un type produit naturel. La correspondance entre les objets des catégories et les types permet ainsi de réinterpréter les langages de programmation comme des logiques (via la correspondance de Curry-Howard ) et comme d'autres types de systèmes mathématiques, comme nous le verrons plus loin.

Logique

Dans le cadre de la correspondance de Curry-Howard , l'existence du currying et du décurrying est équivalente au théorème logique

L' objet exponentiel

théorie des catégories

Les notions de curryfication et de décurryfication mentionnées ci-dessus trouvent leur formulation la plus générale et abstraite en théorie des catégories . La curryfication est une propriété universelle d'un objet exponentiel et induit une adjonction dans les catégories cartésiennes fermées . Autrement dit, il existe un isomorphisme naturel entre les morphismes d'un produit binaire.

Ce résultat se généralise à un résultat plus large dans les catégories monoïdales fermées : la curryfication est l’affirmation que le produit tensoriel et le Hom interne sont des foncteurs adjoints ; c’est-à-dire que pour tout objet

Ici, Hom désigne le foncteur Hom (externe) de tous les morphismes de la catégorie, tandis que

La curryfication peut échouer de deux manières. Premièrement, si une catégorie n'est pas fermée et ne possède donc pas de foncteur hom interne (il est possible qu'il existe plusieurs choix pour un tel foncteur). Deuxièmement, si elle n'est pas monoïdale et ne possède donc pas de produit (c'est-à-dire qu'elle ne permet pas de représenter des paires d'objets). Les catégories qui possèdent à la fois un produit et un foncteur hom interne sont précisément les catégories monoïdales fermées.

Le cadre des catégories fermées cartésiennes est suffisant pour la discussion de la logique classique ; le cadre plus général des catégories monoïdales fermées convient au calcul quantique .

La différence entre ces deux notions réside dans le fait que le produit des catégories cartésiennes (telles que la catégorie des ensembles , les ordres partiels complets ou les algèbres de Heyting ) est simplement le produit cartésien ; il est interprété comme une paire ordonnée d’éléments (ou une liste). Le lambda-calcul, simplement typé, est le langage interne des catégories cartésiennes fermées ; c’est pourquoi les paires et les listes sont les types primaires de la théorie des types de LISP , Scheme et de nombreux langages de programmation fonctionnelle .

En revanche, le produit des catégories monoïdales (telles que l'espace de Hilbert et les espaces vectoriels de l'analyse fonctionnelle ) est le produit tensoriel . Le langage interne de ces catégories est la logique linéaire , une forme de logique quantique ; le système de types correspondant est le système de types linéaires . Ces catégories conviennent à la description d'états quantiques intriqués et, plus généralement, permettent une vaste généralisation de la correspondance de Curry-Howard à la mécanique quantique , aux cobordismes en topologie algébrique et à la théorie des cordes . Le système de types linéaires et la logique linéaire sont utiles pour décrire les primitives de synchronisation , telles que les verrous d'exclusion mutuelle, et le fonctionnement des distributeurs automatiques.

À l'inverse, l'application de fonction partielle

, le curry produit

En revanche, l'application partielle d'une fonction désigne le processus qui consiste à fixer un certain nombre d'arguments à une fonction, produisant ainsi une autre fonction d'arité plus petite. Étant donné la définition de

Intuitivement, l'application partielle d'une fonction signifie que « si vous fixez le premier argument de la fonction, vous obtenez une fonction des arguments restants ». Par exemple, si la fonction div représente l'opération de division x / y , alors div avec le paramètre x fixé à 1 (c'est-à-dire div 1) est une autre fonction : la même que la fonction inv qui renvoie l'inverse multiplicatif de son argument, défini par inv ( y ) = 1/ y .

L'intérêt pratique de l'application partielle réside dans le fait que les fonctions obtenues en fournissant seulement certains arguments à une fonction sont souvent utiles ; par exemple, de nombreux langages possèdent une fonction ou un opérateur similaire à `addition` plus_one. L'application partielle facilite la définition de ces fonctions, par exemple en créant une fonction qui représente l'opérateur d'addition avec `undefined` comme premier argument.

L'application partielle peut être vue comme l'évaluation d'une fonction curryfiée en un point fixe, par exemple étant donné

Ainsi, l'application partielle se réduit à une fonction curryfiée en un point fixe. De plus, une fonction curryfiée en un point fixe est (trivialement) une application partielle. Pour preuve supplémentaire, notons que, étant donné une fonction quelconque

Ainsi, une application partielle peut être définie comme le résultat objectif d'une seule application de l'opérateur curry sur un certain ordre des entrées d'une fonction.

Plus d articles de Worldlex Wiki

Revenez a l index pour explorer davantage de pages sur l histoire, la science, la culture, la geographie et la societe en francais.

Explorer l index