首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >简单ocaml型误差

简单ocaml型误差
EN

Stack Overflow用户
提问于 2016-09-09 13:03:43
回答 2查看 78关注 0票数 3

功能规格:

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

代码:

代码语言:javascript
复制
let any_zeroes l: int list = 
    List.exists 0 l

错误:

代码语言:javascript
复制
This expression has type int but an expression was expected of type
         'a -> bool

当我将0标记为int list时,我不知道为什么Ocaml与int list有问题。如果有人能帮我解决这个问题,我们将不胜感激!

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-09 13:45:24

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

代码语言:javascript
复制
let any_zeroes l: int list

意味着any_zeroes是一个函数,它返回一个int list。注释它的一种正确方法是:

代码语言:javascript
复制
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

票数 3
EN

Stack Overflow用户

发布于 2016-09-10 11:05:26

类型注释let any_zeroes l: int list = ...意味着any_zeroes l的类型是int list;这不是这里的意思。

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

代码语言:javascript
复制
let any_zeroes 
: int list -> bool 
= fun l -> List.exists 0 l

在最高一级,信息技术反馈:

代码语言:javascript
复制
= fun l -> List.exists 0 l;;
                       ^
This expression has type int but an expression was expected of type
     'a -> bool

实际上,由于List.exists的类型,此表达式无法进行类型检查。

代码语言:javascript
复制
# List.exists;;
- : ('a -> bool) -> 'a list -> bool = <fun>

第一个参数是谓词,而0不是。正确的执行是:

代码语言:javascript
复制
let any_zeroes 
: int list -> bool 
= let is_zero x = x = 0 in
  fun l -> List.exists is_zero l
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39412255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档