警告:调用polyEqual

39

能否有人解释一下这个警告的意思是什么?

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);
1个回答

58
'a 表示“任意类型”,而 ''a 表示“可以进行相等比较的任意类型”。由于你的 alreadyVisited 函数使用 = 比较了 xv,所以 xv 必须具有支持它们进行相等比较的类型,因此得到了类型 ''a
这个警告是因为你正在比较两个多态类型的值是否相等,会导致低效率。
如何消除警告?将函数更改为仅适用于特定类型,而不是任意类型。
你应该关心这个警告吗?大概不需要。在大多数情况下,我认为拥有一个可以适用于任何类型的函数比拥有最高效的代码更重要,所以我会忽略这个警告。

我在这个可能被简化的情况下得到了同样的警告:fun some_fun((*stuff*)) = [];,很可能是因为编译器无法推断空列表的类型。将一个字符串放入列表中可以消除警告。 - brntsllvn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接