ML中的警告

时间:2010-12-01 09:00:42

标签: sml smlnj

有人可以解释一下,这个警告意味着什么?

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 个答案:

答案 0 :(得分:46)

'a表示“任何类型”,而''a表示“可以比较相等的任何类型”。由于您的alreadyVisited函数使用xv=进行了比较,因此xv需要一种支持比较它们的类型,所以你得到类型''a

警告意味着您要将两个值与多态类型进行比较以获得相等。

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

你如何摆脱警告?通过将您的功能更改为仅使用特定类型而不是任何类型。

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