功能规格:
编写一个返回真的函数any_zeroes : int list -> bool当且仅当输入列表包含至少一个0
代码:
let any_zeroes l: int list =
List.exists 0 l错误:
This expression has type int but an expression was expected of type
'a -> bool当我将0标记为int list时,我不知道为什么Ocaml与int list有问题。如果有人能帮我解决这个问题,我们将不胜感激!
谢谢!
发布于 2016-09-09 13:45:24
因此,首先,您没有将l标记为int list,语法如下:
let any_zeroes l: int list意味着any_zeroes是一个函数,它返回一个int list。注释它的一种正确方法是:
let any_zeroes (l : int list) : bool第二,你做标记并不能改变程序的语义。它是一个类型约束,它告诉类型推理系统,您希望将此类型统一到您指定的任何内容。如果类型检查器无法完成此操作,则会出现错误。类型检查器不需要您的约束,它们主要是为可读性而添加的。(我认为这也是你正在修的课程的要求)。
最后,错误不是指向l (正如您所认为的那样),而是指向0。消息告诉您,List.exists函数接受一个类型为'a -> bool的函数作为第一个参数,但是您试图用具有int类型的0来填充它。因此,类型系统试图统一int和'a list,并且没有int = 'a list那样的'a,所以它不键入check。因此,您需要传递一个函数,或者按照Anton的建议使用List.mem。
发布于 2016-09-10 11:05:26
类型注释let any_zeroes l: int list = ...意味着any_zeroes 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实际上,由于List.exists的类型,此表达式无法进行类型检查。
# List.exists;;
- : ('a -> bool) -> 'a list -> bool = <fun>第一个参数是谓词,而0不是。正确的执行是:
let any_zeroes
: int list -> bool
= let is_zero x = x = 0 in
fun l -> List.exists is_zero lhttps://stackoverflow.com/questions/39412255
复制相似问题