gpt4 book ai didi

types - 为什么在 Ocaml 中使用模块类型?

转载 作者:行者123 更新时间:2023-12-03 19:49:09 25 4
gpt4 key购买 nike

我对 Ocaml 中的模块类型感到困惑。

我想知道 在什么情况下我们应该使用模块类型?

我通常使用 .mli 中的模块 sig 来暴露一些细节,然后放
.ml 中对应的实现模块结构。

例如:

.mli

module A:
sig
type t = T of string
end

.ml
module A =
struct
type t = T of string
end

出于这个原因,我认为 Ocaml 的模块类似于 C 中的 .h 和 .c 文件。

我知道模块类型可以声明一个接口(interface),但是接口(interface)是 不是 和Java的接口(interface)一样。

就像书中的一个例子:
open Core.Std

module type ID = sig
type t
val of_string : string -> t
val to_string : t -> string
end

module String_id = struct
type t = string
let of_string x = x
let to_string x = x
end

module Username : ID = String_id
module Hostname : ID = String_id

type session_info = { user: Username.t;
host: Hostname.t;
when_started: Time.t;
}

let sessions_have_same_user s1 s2 =
s1.user = s2.host

前面的代码 有一个错误 :它将一个 session 中的用户名与另一个 session 中的主机进行比较,而此时它应该在两种情况下都比较用户名。

似乎模块类型无法为其实现提供新的通用父类(super class)型。

模块类型的实际应用是什么??

最佳答案

这里使用模块类型来隐藏类型t给模块的用户。

当一个人使用 Username.tHostname.t不能依赖这些类型是字符串、整数或任何特定类型。模块类型使它们不透明,就好像它们不是模块接口(interface)的一部分,而只是一个实现细节,模块编写者将来会改变它。

基本上,该模块的用户只能对类型 t 进行操作。通过模块功能。

编译器检查用户代码没有对这些类型做出任何假设t实际上是这样,以便将来模块编写者可以在不破坏用户代码的情况下更改它们。

关于types - 为什么在 Ocaml 中使用模块类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47920327/

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