J'aime bien ces dépêches-là, ça m'oblige à réfléchir comment je ferai ça dans mon langage préféré, qui est... L'Ada :)
J'ai donc tenté de faire les deux exemples.
Attention, il y a peut-être mieux :
L'avantage ici est que, comme en Haskell, il est impossible dans un CASE d'oublier une alternative, le compilateur ne voudra jamais.
De fait, l'ajout d'un élément à l'énumération va forcer le développeur à compléter son record et aussi à compléter la fonction Surface.
J'ai laissé de côté la notion de mutabilité des variants mais pour ceux que ça intéresse, c'est là :)
Pour le deuxième exemple, c'est plus facile, la programmation multi-processeurs fait partie de la norme et la version 2012 du langage a introduit l'annexe Multiprocessors (ça, c'est là)
withSystem.Multiprocessors;useSystem.Multiprocessors;withAda.Text_Io;useAda.Text_Io;procedureMTistypeCPU_CONFSis(TOUS_LES_CPUS,LA_MOITIE_SEULEMENT,AUTRE_CHOSE);subtypeNB_CPUisCPUrange1..Number_Of_CPUs;procedureSetGlobalThreadCount(Config: CPU_CONFS)is-- TOUS_LES_CPUS est comme CPU'Lastbegin-- Quelque chose ici avec des Task et autres joyeusetés-- en fontion de la confcaseConfigiswhenTOUS_LES_CPUS=>Put_Line("Zou, à fond "&CPU'Image(Number_Of_CPUs));whenLA_MOITIE_SEULEMENT=>Put_Line("Mollo "&CPU'Image(Number_Of_CPUs/2));whenAUTRE_CHOSE=>Put_Line("Smart");endcase;endSetGlobalThreadCount;procedureSetGlobalThreadCount(combien: NB_CPU)isbegin-- Un autre truc en fonction du nombre de CPUPut_Line("nb CPU : "&NB_CPU'Image(combien));endSetGlobalThreadCount;beginSetGlobalThreadCount(LA_MOITIE_SEULEMENT);SetGlobalThreadCount(12);endMT;
Number_Of_CPUs étant une fonction dont la valeur n'est pas connue à la compilation, le compilateur ne détecte pas que 12 CPUs, c'est trop... Ça donne une jolie exception CONTRAINT_ERROR qu'il reste à gérer.
Voilà donc ma petite contribution et merci pour le petit exercice et cette petite présentation bien sympa d'exemples de typage statique en Haskell.
# Plus verbeux que le C++
Posté par Blackknight (site web personnel, Mastodon) . En réponse au journal Sortie de GHC 8.0.2 et une petite histoire de typage statique. Évalué à 9.
J'aime bien ces dépêches-là, ça m'oblige à réfléchir comment je ferai ça dans mon langage préféré, qui est... L'Ada :)
J'ai donc tenté de faire les deux exemples.
Attention, il y a peut-être mieux :
L'avantage ici est que, comme en Haskell, il est impossible dans un CASE d'oublier une alternative, le compilateur ne voudra jamais.
De fait, l'ajout d'un élément à l'énumération va forcer le développeur à compléter son record et aussi à compléter la fonction Surface.
J'ai laissé de côté la notion de mutabilité des variants mais pour ceux que ça intéresse, c'est là :)
Pour le deuxième exemple, c'est plus facile, la programmation multi-processeurs fait partie de la norme et la version 2012 du langage a introduit l'annexe Multiprocessors (ça, c'est là)
Number_Of_CPUs étant une fonction dont la valeur n'est pas connue à la compilation, le compilateur ne détecte pas que 12 CPUs, c'est trop... Ça donne une jolie exception CONTRAINT_ERROR qu'il reste à gérer.
Voilà donc ma petite contribution et merci pour le petit exercice et cette petite présentation bien sympa d'exemples de typage statique en Haskell.