Où sinon, plutôt que de mettre un constructeur en plus dans ton langage (qui ne correspond sans doute à rien dans ta grammaire), il y a peut être moyen de mixer les GADT avec un usage plus « standard » des types fantômes. Comme dans cet exemple :
moduleGADT=structtype(_,_)term=|Lit:int->(int,_)term|Add:(int,_)term*(int,_)term->(int,_)term|Mult:(int,_)term*(int,_)term->(int,_)term|Div:(int,_)term*(int,[`NZ])term->(int,_)termletreceval:typeab.(a,b)term->int=function|Litn->n|Add(t,t')->(evalt)+(evalt')|Mult(t,t')->(evalt)*(evalt')|Div(t,t')->(evalt)/(evalt')letlitn=Litnletaddtt'=Add(t,t')letmulttt'=Mult(t,t')letdivtt'=Div(t,t')letsquare_add_onet:(int,[`NZ])term=(add(multtt)(lit1))endopenGADT;;lett1=square_add_one(lit(-3));;valt1:(int,[`NZ])term=Add(Mult(Lit(-3),Lit(-3)),Lit1)lett2=lit23;;valt2:(int,'_a)term=Lit23lett3=divt2t1;;valt3:(int,'_a)term=Div(Lit23,Add(Mult(Lit(-3),Lit(-3)),Lit1))evalt1,evalt2,evalt3;;-:int*int*int=(10,23,2)(* et si tu veux convertir au bon type dans la REPL, tu peux faire *)((lit4):>(int,[`NZ])term);;-:(int,[`NZ])term=Lit4
Ainsi tu n'obtiendras des termes non nuls qu'à partir de fonctions dont tu es certain que c'est ce qu'elles produisent.
Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.
[^] # Re: Dans l'art voluptueuse de ne rien comprendre
Posté par kantien . En réponse au journal EDSL et F-algèbres. Évalué à 2.
Où sinon, plutôt que de mettre un constructeur en plus dans ton langage (qui ne correspond sans doute à rien dans ta grammaire), il y a peut être moyen de mixer les GADT avec un usage plus « standard » des types fantômes. Comme dans cet exemple :
Ainsi tu n'obtiendras des termes non nuls qu'à partir de fonctions dont tu es certain que c'est ce qu'elles produisent.
Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.