ML的警告和类型的含义

时间:2012-09-16 03:03:52

标签: 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;

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

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

我不明白这个警告。为什么它出现和类型。 ''为什么它有两个'? ''? “列表列表”和“列表列表”之间有什么区别?

3 个答案:

答案 0 :(得分:4)

摘自ML Hints

  无论何时使用Warning: calling polyEqual,都可以[{1}} [可能会发生]   将两个值与多态类型进行比较。

     

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

答案 1 :(得分:3)

回答你的第二个问题,

  

为什么它有两个'? ''? '列表和列表之间有什么区别?   '列表清单?

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

答案 2 :(得分: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 ;