SML如何检查变量类型?

问题描述:

有什么方法检查/测试变量的类型吗?SML如何检查变量类型?

我想用这样的:

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

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,这样会奏效。

这是不可能做你一般想要的东西,即使是x多态型的(没有做包装自己是查克建议)。

这是一个慎重的设计决定;它可以就功能做出非常强有力的结论,只是基于它们的类型,否则就无法做出来。例如,它可以让你说一个'a -> 'a类型的函数必须是标识函数(或者一个总是抛出异常的函数,或者永不返回的函数)。如果你能检查什么'a是在运行时,你可以写一个鬼鬼祟祟的程序像

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

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