【问题标题】:SML How to check variable type?SML 如何检查变量类型?
【发布时间】:2011-04-12 10:52:23
【问题描述】:

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

我想这样使用它:

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

【问题讨论】:

    标签: sml


    【解决方案1】:

    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,这样就可以了。

    【讨论】:

      【解决方案2】:

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

      这是一个深思熟虑的设计决定;它可以根据函数的类型对函数做出非常有力的结论,否则您无法得出这些结论。例如,它让你说一个类型为'a -> 'a 的函数必须是标识函数(或者一个总是抛出异常的函数,或者一个永远不会返回的函数)。如果你可以检查 'a 在运行时是什么,你可以写一个像

      这样的鬼鬼祟祟的程序
      fun sneaky (x : 'a) : 'a = if x = int then infinite_loop() else x
      

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

      【讨论】:

        猜你喜欢
        • 2021-01-13
        • 2018-03-21
        • 1970-01-01
        • 2018-07-28
        • 2021-11-17
        • 2011-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多