Ici, je lis cela:
Haskell n'a certainement pas le système de type le plus avancé (même pas si vous comptez les langues de recherche), mais parmi toutes les langues réellement utilisées dans la production, Haskell est probablement au sommet.
Je demande donc deux choses:
- quels langages de recherche ont des systèmes de types plus puissants que Haskell;
- qu'est-ce qu'ils améliorent.
Je suis juste un programmeur, donc je ne connais pas beaucoup d'objets mathématiques utilisés dans la théorie des types, veuillez fournir des explications douces si vous le pouvez.
programming-languages
type-theory
Виталий Олегович
la source
la source
Réponses:
La question est quelque peu problématique, car elle repose sur une définition subjective de «mieux».
Langages de type dépendants tels que Agda , Idris et Coq ont un système de type plus fort que Haskell. Cela signifie que vous pouvez utiliser les types de ces langages pour prouver strictement plus de propriétés de votre code qu'en Haskell. Autrement dit, il y a plus de programmes incorrects qui seront interceptés.
Cependant, cela a un prix: l'inférence de type et le test de l'existence de valeurs d'un type donné ne sont plus possibles. Cela signifie que pour ces langues, vous devez annoter explicitement votre code avec les types. Essentiellement, cela se résume à écrire vos propres preuves d'exactitude pour votre code.
Ces langues sont-elles donc "meilleures" que Haskell? Ils peuvent vérifier les preuves avancées de l'exactitude de votre code, mais ils ne peuvent pas prouver automatiquement les propriétés de votre code comme le peut Haskell.
Un autre langage de recherche qui est "meilleur" que Haskell est LiquidHaskell . Il s'agit essentiellement de Haskell avec des types de raffinement boulonnés sur le dessus, analysés à partir de commentaires spéciaux.
Les types de raffinement vous permettent d'affiner les types avec des propriétés. Par exemple, au lieu d'avoir un
Int
, vous pouvez spécifier{i : Int | i > 0}
, en donnant le type de tous les entiers positifs. L'inférence de type est décidable avec les types de raffinement, mais vous ne pouvez pas prouver avec eux autant de propriétés d'exactitude que vous le pouvez avec les types dépendants.Il existe d'autres systèmes de raffinement, mais je ne connais pas très bien l'un d'eux.
la source
La famille de langages ML (StandardML, OCaml ) est issue d'une tradition similaire à Haskell et a donc des systèmes de types similaires. Cependant, ils ne sont pas exactement les mêmes que Haskell, et certaines de leurs fonctionnalités pourraient vous convenir mieux (il n'existe pas de système de type objectivement meilleur car les systèmes de type dans les langages de programmation existent pour aider les humains ). Voici quelques fonctionnalités d'OCaml que Haskell n'a pas (mais pourrait avoir un concept similaire correspondant), ou Haskell n'a mais fait différemment:
Et s'il vous plaît, il n'est pas nécessaire de transformer cela en une fusillade ML-Haskell, sinon je vais commencer à créer un lien vers les articles de blog de Bob Harper ;-)
la source
Le langage de recherche Clean a un meilleur système de types que Haskell, car il a des types d'unicité . Les idées derrière les types d'unicité sont étroitement liées à la logique linéaire , qui est plus proche du "monde réel" limité en ressources que la logique classique.
Le langage anti-recherche Rust possède également un système de caractères avec des caractéristiques uniques qui sont plus proches du «monde réel» que les systèmes classiques de type pur. La plupart des idées qui ont influencé le système de caractères ont été publiées complètement indépendantes de Rust bien avant son existence. Mais la façon dont ces vieilles idées sont rassemblées est unique et mériterait également de véritables publications de recherche, même s'il existe des lacunes et des incohérences connues.
la source