【发布时间】:2011-04-12 10:52:23
【问题描述】:
有没有办法检查/测试变量的类型?
我想这样使用它:
if x = int then foo
else if x = real then bar
else if x = string then ...
else .....
【问题讨论】:
标签: sml
有没有办法检查/测试变量的类型?
我想这样使用它:
if x = int then foo
else if x = real then bar
else if x = string then ...
else .....
【问题讨论】:
标签: sml
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 是多态类型,一般也不可能做你想做的事(不按照 Chuck 的建议进行包装)。
这是一个深思熟虑的设计决定;它可以根据函数的类型对函数做出非常有力的结论,否则您无法得出这些结论。例如,它让你说一个类型为'a -> 'a 的函数必须是标识函数(或者一个总是抛出异常的函数,或者一个永远不会返回的函数)。如果你可以检查 'a 在运行时是什么,你可以写一个像
fun sneaky (x : 'a) : 'a = if x = int then infinite_loop() else x
这将违反规则。 (这是一个非常简单的示例,但是通过知道您的类型系统具有此属性,您可以做很多不那么简单的事情。)
【讨论】: