您好我在以下SML代码中遇到编译错误,有人可以帮忙吗?
Error: operator and operand don't agree [UBOUND match]
operator domain: 'Z list
operand: ''list
in expression:
null mylist
stdIn:4.15-4.24 Error: operator and operand don't agree [UBOUND match]
operator domain: 'Z list
operand: ''list
in expression:
hd mylist
stdIn:6.19-6.36 Error: operator and operand don't agree [UBOUND match]
operator domain: 'Z list
operand: ''list
in expression:
tl mylist
stdIn:6.10-7.21 Error: operator is not a function [circularity]
operator: 'Z
表达式中的: (exists_in(item,tl mylist))exists_in
代码:
fun exists_in (item: ''int, mylist:''list) =
if null mylist
then false
else if (hd mylist) = item
then true
else exists_in(item, tl mylist)
exists_in(1,[1,2,3]);
答案 0 :(得分:4)
每条错误消息告诉您的是,您正在将某个功能应用于错误类型的内容。例如,null
的类型为'a list -> bool
,因此希望应用于'a list
类型的参数。在exists_in
,您已将null
应用于第4行''list
类型的内容。
SML还提供类型推断,因此不需要指定参数的类型(尽管它对调试很有用)。如果您确实要指定类型,正如molbdnilo所评论的那样,您要查找的类型包括int
和int list
,或''a
和''a list
('' a
是等式类型的类型变量。)
无关紧要,编写函数的一种更惯用的方法是通过对列表结构进行大小写分析来定义它,而不是使用布尔检查。这样做的好处是,您可以立即获得支持布尔检查的数据,以确定列表是否为空,而不是检查然后提取数据。例如:
fun exists_in (item, []) = false
| exists_in (item, h::t) = (item = h) orelse exists_in (item, t)