SML如何检查变量类型?

时间:2010-09-15 00:51:45

标签: sml

有没有办法检查/测试变量的类型?

我想这样用:

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

2 个答案:

答案 0 :(得分:21)

ML语言是静态类型的,因此某些东西在不同时间不可能有不同的类型。 x有时不能使用int类型,有时会使用string类型。如果你需要这样的行为,通常的方法是将值包装在一个编码类型信息的容器中,如:

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

然后你可以在构造函数上进行模式匹配:

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

在这种情况下,x显然是wrapper,因此可以使用。

答案 1 :(得分:8)

即使x属于多态类型(不像Chuck建议的那样自行包装),也不可能做你想要的一般事情。

这是一个刻意的设计决定;它使得有可能就功能做出非常有力的结论,只是根据它们的类型,你无法做到。例如,它允许您说类型为'a -> 'a的函数必须是标识函数(或始终抛出异常的函数,或者永不返回的函数)。如果你可以在运行时检查'a是什么,你可以写一个像

这样的偷偷摸摸的程序
fun sneaky (x : 'a) : 'a = if x = int then infinite_loop() else x

会违反规则。 (这是一个非常简单的例子,但是你知道你的类型系统有这个属性,你可以做很多不那么重要的事情。)