【问题标题】:Warning: calling polyEqual警告:调用 polyEqual
【发布时间】:2011-05-18 09:12:59
【问题描述】:

谁能解释一下,这个警告是什么意思?

stdIn:18.35 Warning: calling polyEqual

以及为什么我在下面的语句中有 "a 而不是 'a:

val alreadyVisited = fn : ''a * ''a list -> bool

这是我的功能:

fun alreadyVisited(v, []) = false
    | alreadyVisited(v, x::xs) = if(x=v) then true
        else alreadyVisited(v, xs);

【问题讨论】:

    标签: sml smlnj


    【解决方案1】:

    'a 表示“任何类型”,而''a 表示“可以比较是否相等的任何类型”。由于您的alreadyVisited 函数使用= 比较xvxv 需要有一个支持比较它们是否相等的类型,所以您得到''a 类型。

    警告意味着您正在比较两个具有多态类型的值是否相等。

    为什么会产生警告?因为它比比较两个已知类型的值是否相等效率低。

    你如何摆脱警告?通过将您的函数更改为仅适用于特定类型而不是任何类型。

    您应该关心警告吗?可能不是。在大多数情况下,我认为拥有一个适用于任何类型的函数比拥有最高效的代码更重要,所以我会忽略警告。

    【讨论】:

    • 我在可能简化的情况下得到相同的警告:fun some_fun((*stuff*)) = []; 可能是因为编译器无法推断空列表的类型。例如,在列表中放置一个字符串会使警告消失。
    猜你喜欢
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 2011-05-11
    • 1970-01-01
    • 2020-10-29
    相关资源
    最近更新 更多