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 .....
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 .....
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.
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ść.)