Existe-t-il un moyen de vérifier/tester le type d'une variable?SML Comment vérifier le type de variable?
Je veux l'utiliser comme ceci:
if x = int then foo
else if x = real then bar
else if x = string then ...
else .....
Existe-t-il un moyen de vérifier/tester le type d'une variable?SML Comment vérifier le type de variable?
Je veux l'utiliser comme ceci:
if x = int then foo
else if x = real then bar
else if x = string then ...
else .....
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.
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é.)