1
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;

这是 ml 代码,我收到此警告并输入。

stdIn:6.16 Warning: calling polyEqual
val a = fn : ''a list list -> bool

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

4

3 回答 3

5

摘自ML 提示

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

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

于 2012-09-16T04:16:23.360 回答
3

要回答你的第二个问题,

为什么它有两个'?''?'a list list 和 ''a list list 有什么区别?

''a与 相同'a,但要求它是相等类型。SML 中的相等类型是可以使用 比较的类型=。不能使用 比较不等式类型=。创建数据类型时,可以指定它是否为相等类型。

于 2012-09-17T19:15:37.590 回答
1
dict=val a =[("a",[1,2]),("b",[2,3])] ;

这是实现在字典中查找的代码

 fun look key [] = []
| look key ((a,b)::xs) = if (key =a ) then b else look key xs ;

输出为

 test1.sml:8.36 Warning: calling polyEqual

这是因为它不知道要比较的类型是什么,所以下面的代码说两者都是字符串类型。

fun look (key:string) [] = []
| look (key:string) ((a:string,b)::xs) = if (key =a ) then b else look (key:string) xs ;
于 2017-09-20T12:04:07.580 回答