SML代码出错

时间:2017-09-13 04:38:47

标签: sml smlnj

您好我在以下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]);

1 个答案:

答案 0 :(得分:4)

每条错误消息告诉您的是,您正在将某个功能应用于错误类型的内容。例如,null的类型为'a list -> bool,因此希望应用于'a list类型的参数。在exists_in,您已将null应用于第4行''list类型的内容。

SML还提供类型推断,因此不需要指定参数的类型(尽管它对调试很有用)。如果您确实要指定类型,正如molbdnilo所评论的那样,您要查找的类型包括intint list,或''a''a list'' a是等式类型的类型变量。)

无关紧要,编写函数的一种更惯用的方法是通过对列表结构进行大小写分析来定义它,而不是使用布尔检查。这样做的好处是,您可以立即获得支持布尔检查的数据,以确定列表是否为空,而不是检查然后提取数据。例如:

fun exists_in (item, []) = false
  | exists_in (item, h::t) = (item = h) orelse exists_in (item, t)