Type d'unicité - Uniqueness type
Systèmes de types |
---|
Concepts généraux |
Principales catégories |
Catégories mineures |
En informatique , un type unique garantit qu'un objet est utilisé de manière monothread , avec au plus une seule référence. Si une valeur a un type unique, une fonction qui lui est appliquée peut être optimisée pour mettre à jour la valeur en place dans le code objet . De telles mises à jour sur place améliorent l'efficacité des langages fonctionnels tout en maintenant la transparence référentielle . Les types uniques peuvent également être utilisés pour intégrer la programmation fonctionnelle et impérative.
introduction
Le typage d'unicité est mieux expliqué à l'aide d'un exemple. Considérons une fonction readLine
qui lit la ligne de texte suivante à partir d'un fichier donné :
function readLine(File f) returns String
return line where
String line = doImperativeReadLineSystemCall(f)
end
end
Maintenant , doImperativeReadLineSystemCall
lit la ligne suivante du fichier en utilisant un système d' exploitation -level appel système qui a pour effet secondaire de changer la position actuelle dans le fichier. Mais cela viole la transparence référentielle car l'appeler plusieurs fois avec le même argument renverra des résultats différents à chaque fois que la position actuelle dans le fichier est déplacée. Ceci à son tour fait readLine
violer la transparence référentielle car elle appelle doImperativeReadLineSystemCall
.
Cependant, en utilisant le typage d'unicité, nous pouvons construire une nouvelle version readLine
qui est référentiellement transparente même si elle est construite au-dessus d'une fonction qui n'est pas référentiellement transparente :
function readLine2(unique File f) returns (unique File, String)
return (differentF, line) where
String line = doImperativeReadLineSystemCall(f)
File differentF = newFileFromExistingFile(f)
end
end
La unique
déclaration spécifie que le type de f
est unique ; c'est-à-dire qui f
ne peut plus jamais être référencé par l'appelant de readLine2
after readLine2
return, et cette restriction est imposée par le type system . Et puisque readLine2
ne renvoie pas f
lui-même mais plutôt un nouvel objet fichier différent differentF
, cela signifie qu'il est impossible readLine2
d'être appelé à nouveau avec f
comme argument, préservant ainsi la transparence référentielle tout en permettant aux effets secondaires de se produire.
Langages de programmation
Les types d'unicité sont implémentés dans des langages de programmation fonctionnels tels que Clean , Mercury , SAC et Idris . Ils sont parfois utilisés pour effectuer des opérations d' E/S dans des langages fonctionnels au lieu de monades .
Une extension de compilateur a été développée pour le langage de programmation Scala qui utilise des annotations pour gérer l'unicité dans le contexte de la transmission de messages entre les acteurs.
Relation avec le typage linéaire
Un type unique est très similaire à un type linéaire , au point que les termes sont souvent utilisés de manière interchangeable, mais il y a en fait une distinction : le typage linéaire réel permet à une valeur non linéaire d'être transtypée sous une forme linéaire, tout en conservant plusieurs références à celui-ci. L'unicité garantit qu'une valeur n'a pas d'autres références à elle, tandis que la linéarité garantit qu'aucune autre référence ne peut être faite à une valeur.
Voir également
Les références
Liens externes
- Bibliographie sur la logique linéaire
- Unicité Saisie simplifiée
- Les écrits de Philip Wadler sur la logique linéaire
Discussions sur le typage d'unicité dans les langages de programmation
- Lisp linéaire animé - "Regarde maman, pas de déchets!"
- Logique linéaire et piles de permutation - Le quatrième sera le premier
- Minimiser la mise à jour du nombre de références avec des pointeurs différés et ancrés pour les structures de données fonctionnelles
- Variables à usage unique et objets linéaires -- Gestion du stockage, réflexion et multi-threading