10

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

我想像这样使用它:

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

2 回答 2

21

ML 语言是静态类型的,所以不可能在不同的时间有不同的类型。x有时不能有 type int,有时有 type string。如果您需要这样的行为,通常的方法是将值包装在一个对类型信息进行编码的容器中,例如:

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

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

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

在这种情况下,x明确输入为 a wrapper,这样就可以了。

于 2010-09-15T01:27:22.040 回答
8

一般来说,即使x是多态类型,也不可能做你想做的事情(不按照 Chuck 的建议进行包装)。

这是一个深思熟虑的设计决定;它可以根据函数的类型对函数做出非常有力的结论,否则您无法得出这些结论。例如,它允许您说具有类型的函数'a -> 'a必须是标识函数(或者总是抛出异常的函数,或者从不返回的函数)。如果您可以检查'a运行时的内容,则可以编写一个鬼鬼祟祟的程序,例如

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

那将违反规则。(这是一个非常简单的示例,但是通过知道您的类型系统具有此属性,您可以做很多不那么简单的事情。)

于 2010-09-15T02:05:22.957 回答