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