ADT ?
Il s’agit d’un croisement un peu douteux entre les struct, bien connus de nombreux langages de programmation, et les union, utilisés en C/C++ et qui sont une sorte d’enum. Le tout gonflé aux stéroïdes de la généricité, de la sécurité et du sucre syntaxique.
C'est pas douteux du tout :-) c'est vraiment une algèbre sur les types.
Si on a trois types, mettons Char, Int, et Bool, que l'on peut voir comme l'ensemble des caractères, l'ensemble des entiers, et {true,false}.
On a l'opérateur | haskell qui permet de faire l'union de deux types, par exemple :
dataB_OU_I=BBool|IInt
et un opérateur implicite, qui permet de faire le produit cartésien :
dataC_ET_I=CIBoolInt-- on peut même expliciter cet opérateur, c'est , (virgule) (en ocaml c'est * )dataC_ET_I=CI(Bool,Int)
C'est bien une algèbre avec des propriétés cool :
dataZerodataUn=UndataNeutreUniont=VZero|Ct-- la déclaration précédente est équivalente (isomorphe) à t (en fait c'est faux en haskell à cause des valeurs non définies, mais vrai en ocaml). Équivalent ça veut dire que vous pouvez écrire une fonction de NeutreUnion t dans t, et une de t dans NeutreUnion t telle que la composition des deux soit la fonction identitédataNeutreProduitt=PtUn-- la déclaration précédente est aussi équivalente à t (c'est pas vrai non plus en haskell)-- On a des propriété d'associativitédataSommeab=Aa|BadataProduitab=Pab-- du style Somme a (Somme b c) est équivalent à Somme (Somme a b) c, idem pour le produit-- La distributivité, par exemple :typePersonne=ProduitNom(SommeHommeFemme)-- est équivalent à typePersonne'=Somme(ProduitNomHomme)(ProduitNomFemme)
Donc, tout ça, c'est vraiment une algèbre sur les types. Et là où c'est encore plus fort... c'est que c'est pas seulement une algèbre... C'est tout un langage :
Quand j'écrivais :
dataSommeab=Sommeab
Ce Somme c'est une "fonction", au niveau des types. On lui donne deux types et elle en construit le type somme. Haskell permet aussi de faire des choses du genre :
dataApplyTypeFunfab=App(fab)
Donc là, le f c'est une fonction sur les type à deux paramètres. Par exemple, ça peut être la somme, le produit, une projection, une liste, un ensemble, l'opérateur (->). Ça permet d'écrire du code super générique, et c'est super cool.
# À propos du coté algébrique des ADT
Posté par foobarbazz . En réponse à la dépêche Sortie de GHC 8.0.2 et une petite histoire de typage statique. Évalué à 4.
C'est pas douteux du tout :-) c'est vraiment une algèbre sur les types.
Si on a trois types, mettons Char, Int, et Bool, que l'on peut voir comme l'ensemble des caractères, l'ensemble des entiers, et {true,false}.
On a l'opérateur
|haskell qui permet de faire l'union de deux types, par exemple :et un opérateur implicite, qui permet de faire le produit cartésien :
C'est bien une algèbre avec des propriétés cool :
Donc, tout ça, c'est vraiment une algèbre sur les types. Et là où c'est encore plus fort... c'est que c'est pas seulement une algèbre... C'est tout un langage :
Quand j'écrivais :
Ce
Sommec'est une "fonction", au niveau des types. On lui donne deux types et elle en construit le type somme. Haskell permet aussi de faire des choses du genre :Donc là, le f c'est une fonction sur les type à deux paramètres. Par exemple, ça peut être la somme, le produit, une projection, une liste, un ensemble, l'opérateur (->). Ça permet d'écrire du code super générique, et c'est super cool.