有没有办法检查/测试变量的类型?
我想这样用:
if x = int then foo
else if x = real then bar
else if x = string then ...
else .....
答案 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
会违反规则。 (这是一个非常简单的例子,但是你知道你的类型系统有这个属性,你可以做很多不那么重要的事情。)