简单ocaml类型错误

简单ocaml类型错误,ocaml,typeerror,Ocaml,Typeerror,功能规格: 编写一个函数any_zeroes:int list->bool,当且仅当输入列表至少包含一个0 代码: 错误: 当我将l标记为int列表时,我不知道Ocaml为什么会对0产生问题。如果有人能帮我解决这个问题,我将不胜感激 谢谢 首先,您没有将l标记为int list,语法: let any_zeroes l: int list 表示any_zero是一个函数,返回int list。注释它的正确方法如下所示: let any_zeroes (l : int list) : bool

功能规格:

编写一个函数
any_zeroes:int list->bool
,当且仅当输入列表至少包含一个
0

代码:

错误:

当我将
l
标记为
int列表时,我不知道Ocaml为什么会对
0
产生问题。如果有人能帮我解决这个问题,我将不胜感激


谢谢

首先,您没有将
l
标记为
int list
,语法:

let any_zeroes l: int list
表示
any_zero
是一个函数,返回
int list
。注释它的正确方法如下所示:

let any_zeroes (l : int list) : bool
第二个事实是,标记某些东西并不会改变程序的语义。它是一个类型约束,它告诉类型推理系统,您希望将此类型统一到您指定的任何类型。如果类型检查器不能做到这一点,它将以一个错误退出。类型检查器不需要您的约束,它们主要是为了可读性而添加的。(我想这也是你所修课程的要求)


最后,错误不是指向
l
(正如您所认为的那样,它被注释了),而是指向
0
。该消息告诉您,
List.exists
函数接受类型为
'a->bool
的函数作为第一个参数,但您试图为其提供类型为
int
0
。因此,类型系统试图统一
int
'a list
,并且没有
int='a list
这样的
'a
,因此它不进行类型检查。因此,您要么需要传递一个函数,要么按照Anton的建议使用
List.mem

类型注释
让任意零l:int list=…
表示
任意零l
的类型为
int list
;这不是你在这里的意思

与您的规范相关的正确类型注释为:

let any_zeroes 
: int list -> bool 
= fun l -> List.exists 0 l
在顶层,它反馈:

= fun l -> List.exists 0 l;;
                       ^
This expression has type int but an expression was expected of type
     'a -> bool
实际上,由于
列表的类型,此表达式无法进行类型检查。exists

# List.exists;;
- : ('a -> bool) -> 'a list -> bool = <fun>

改用
List.mem
= fun l -> List.exists 0 l;;
                       ^
This expression has type int but an expression was expected of type
     'a -> bool
# List.exists;;
- : ('a -> bool) -> 'a list -> bool = <fun>
let any_zeroes 
: int list -> bool 
= let is_zero x = x = 0 in
  fun l -> List.exists is_zero l