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
我不明白这个警告。为什么它出现和类型。 ''为什么它有两个'? ''? “列表列表”和“列表列表”之间有什么区别?
答案 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 ;