gpt4 book ai didi

OCaml 预计有类型单元

转载 作者:行者123 更新时间:2023-12-02 04:22:42 26 4
gpt4 key购买 nike

尝试在 OCaml 中运行以下函数时:

let rec func1 o_list =
match o_list with
| [] -> []
| h::t -> let (nt,inner_list) = h in
if check_if_clear inner_list then
[nt,inner_list]::clear_rules
func1 t
;;

程序输出错误

Characters 139-141: [nt,inner_list]::clear_rules

Error: This variant expression is expected to have type unit The constructor :: does not belong to type unit

您还可以假设函数 check_if_clear 目前始终返回 trueo_list 是一个pair列表,pair本身包含一个元素和一个列表。所以它就像这样 [ 'x , ['a,'b,'c]]clear_rules 一开始只是一个空列表。

最佳答案

您的原始示例在 clear_rules 之后似乎缺少分号。一旦插入并带有附加功能的 stub ,错误消息就可以重现。其原因如下:

if 表达式的 then 分支

if check_if_clear inner_list then
[nt,inner_list]::clear_rules

返回('nt_type, 'inner_list_type)列表list类型的值;这是因为 [nt, inner_list] 构造了 (nt, inner_list) 对的单个项目列表,然后 cons 运算符 :: 使得它是列表的头部。因此,then 分支返回非单位类型。

相反,else分支(由于不存在)具有类型unit(即没有实际值)。但在 OCaml 中,表达式的 then 和 else 分支的类型必须匹配(即属于相同类型或公共(public)父类(super class)型的子类型);因此,没有 else 分支的 if 表达式始终具有类型 unit,此类表达式的 then 分支也是如此。因为它不适合您的情况,所以编译器通过注意到 cons 运算符 :: 具有与以下不同的类型(它创建一个列表并返回它)来告诉您(以迂回的方式)它推断出的单位类型。

从您的评论中我怀疑您的意图不是创建列表,而是执行一些具有副作用的操作。为此,您可能需要以不同的方式编写该操作。

关于OCaml 预计有类型单元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34887527/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com