2010-09-15 6 views

Répondre

20

langues ML sont statiquement typés, il est donc impossible pour quelque chose d'avoir différents types à différents moments. x ne peut pas parfois avoir le type int et à d'autres moments ont le type string. Si vous avez besoin un comportement comme celui-ci, la façon normale d'aller à ce sujet est d'envelopper la valeur dans un conteneur qui code les informations de type, comme:

datatype wrapper = Int of int | Real of real | String of string 

Vous pouvez ensuite motif match sur le constructeur:

case x of Int x -> foo 
     | Real x -> bar 
     | String x -> ... 

Dans ce cas, x est clairement typé wrapper, donc cela fonctionnera.

8

Il n'est pas possible de faire ce que vous voulez en général, même si x est de type polymorphe (sans faire l'emballage vous-même comme Chuck le suggère).

Ceci est une décision de conception délibérée; il permet de tirer des conclusions très fortes sur les fonctions, juste en fonction de leurs types, que vous ne pourriez pas faire autrement. Par exemple, il vous permet de dire qu'une fonction avec le type 'a -> 'a doit être la fonction d'identité (ou une fonction qui lève toujours une exception, ou une fonction qui ne retourne jamais). Si vous pouviez inspectez ce que 'a était lors de l'exécution, vous pouvez écrire un programme sournoise comme

fun sneaky (x : 'a) : 'a = if x = int then infinite_loop() else x 

qui serait contraire à la règle. (Ceci est un exemple assez trivial, mais il y a beaucoup de choses moins triviales que vous pouvez faire en sachant que votre système de type a cette propriété.)

Questions connexes