2010-09-15 8 views
9

Czy istnieje sposób sprawdzenia/przetestowania typu zmiennej?SML Jak sprawdzić typ zmiennej?

Chcę używać go tak jak to: języki

if x = int then foo 
else if x = real then bar 
else if x = string then ... 
    else ..... 

Odpowiedz

20

ML są statycznie wpisane, więc nie jest możliwe, aby coś mieć różne typy w różnych momentach. x nie może czasami mieć typu int, a innym razem musi mieć typ string. Jeśli potrzebujesz zachowanie takiego, normalna droga o to, aby owinąć wartość w pojemniku, który koduje typ informacji, takich jak:

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

następnie można wzór meczu na konstruktora:

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

W tym przypadku x jest wyraźnie wpisany jako wrapper, więc to zadziała.

8

Niemożliwe jest robienie tego, co się chce, nawet jeśli x jest typu polimorficznego (bez wykonywania samopakowania, jak sugeruje Chuck).

To jest przemyślana decyzja projektowa; pozwala wyciągać bardzo mocne wnioski na temat funkcji, opierając się tylko na ich typach, że nie można inaczej. Na przykład, można powiedzieć, że funkcja o typie 'a -> 'a musi być funkcją tożsamości (lub funkcją, która zawsze zgłasza wyjątek lub funkcją, która nigdy nie powraca). Gdybyś mógł sprawdzić co 'a było w czasie wykonywania, można napisać program, podstępne jak

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

które naruszają zasadę. (Jest to dość trywialny przykład, ale istnieje wiele mniej banalnych rzeczy, które możesz zrobić, wiedząc, że twój system typów ma tę właściwość.)