ML 中警告和类型的含义

Q12*_*123 1 sml

fun a(list) = 
   let
   val num = length(hd(list))
   fun inner(list) = 
      if num = length(hd(list)) then
         if tl(list) = nil then true
         else inner(tl(list))
      else false
   in
   if length(hd(list))-1 = length(tl(list)) then inner(tl(list))
   else false
   end;
Run Code Online (Sandbox Code Playgroud)

这是 ml 代码,我收到了此警告和类型。

stdIn:6.16 Warning: calling polyEqual
val a = fn : ''a list list -> bool
Run Code Online (Sandbox Code Playgroud)

我不明白警告。它出现的原因和类型。''a为什么它有两个'?''?'a list list 和''a list list 有什么区别?

j.w*_*w.r 5

摘自ML 提示

Warning: calling polyEqual[可能发生] 每当您使用=多态类型比较两个值时。

例如,fun eq(x,y) = (x = y);将导致生成此警告,因为xy将具有多态类型''a。这完全没问题,您可以忽略警告。它不会在您的代码中报告任何类型的语义错误或类型错误。编译器报告警告是因为 ML 测试多态类型的两个值是否相等的方式可能存在轻微的低效。特别是,要执行相等测试,运行时系统必须首先确定您当前使用的值的类型,然后确定这些值是否相等。第一部分(检查运行时类型)可以使=测试比提前知道类型(例如当我们测试3 = 4并知道=测试应用于整数)。然而,这并不是大多数 ML 用户需要担心的......