简单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