gpt4 book ai didi

ocaml - 强制类型缩写记录

转载 作者:行者123 更新时间:2023-12-01 10:24:41 25 4
gpt4 key购买 nike

为什么我不能在 OCaml 中强制记录类型? int 等基本类型工作正常。

下面是一个示例,其中我构建了一个基本模块 M,我将其包含在模块 A 中。 M.tA 类型的缩写。只要 M.tint,我就可以执行 A.t' :> M.t。当我将它更改为 {i : int} 时,编译器说它不是子类型。我猜这有一个非常具体的原因?

module M = struct
type t = {i : int}
let make () = {i = 10}
end

module A : sig
include module type of M
type t' = private t
val make : unit -> t'
end = struct
include M
type t' = t
end

在顶层:

(A.make() :> M.t);;
Error: Type A.t' is not a subtype of M.t

最佳答案

那是因为 A.t'M.t 没有关系,因为 include 不“保留”相等性,它只是字面上重复了模块结构(或签名)并将其内联到位(作为新类型和值)。所以类型 M.tA.t 没有任何关系,因此与 A.t' 没有任何关系(并且不同的记录类型没有定义结构子类型比如对象或模块)。明显的修复是 type t' = private M.t

更新

上面的内容似乎并不完全正确,因为 type t' = private M.t 在 signature 和 include M type t' = t 在 implementation 做类型检查,所以 include M 保留相等性(否则它无法匹配签名 type t' = private M.t),不像在 M 中复制粘贴内容include M 的位置。但是这个“显然”不适用于创建新类型的 include module type of..

关于ocaml - 强制类型缩写记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17559503/

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