t -> bool val equal : t -> t -> bool end module -6ren">
gpt4 book ai didi

ocaml - 模块, "with type"是做什么的?

转载 作者:行者123 更新时间:2023-12-05 02:28:18 26 4
gpt4 key购买 nike

module type ORDER = sig 
type t
val leq : t -> t -> bool
val equal : t -> t -> bool
end

module Int:ORDER with type t = int = struct
type t = int
let leq = (<=)
let equal = (=)
end

谁能给我解释一下这一行:

    module Int:ORDER with type t = int = struct
this --> with type t = int

我试过没有它:

Int.equal 3 3
Line 1, characters 10-11:
Error: This expression has type int but an expression was expected of type
Int.t

我能看到“它做了什么”,但我无法用语言解释它发生了什么,谢谢

最佳答案

module expression 中的冒号运算符不仅仅是一个签名约束,它也是一个抽象结构。 M : S需要模块 M有签名 S , 并告诉编译器忘记输入 M 的所有内容除 S 中指定的内容外.这就是抽象诞生的地方。

给定定义module Int: S = struct … end (这是 module S = (struct … end : S) 的语法糖),所有编译器都知道 Int 的元素类型是S中记录的内容.如果SORDER , 它的类型 t是抽象的,因此 Int.t是一个抽象类型:Int.t 的事实实际上是 int 的别名是隐藏的。隐藏类型的实际实现正是抽象类型的意义所在。

Int 实际需要的签名是

sig
type t = int
val leq : t -> t -> bool
val equal : t -> t -> bool
end

这几乎就是名为 ORDER 的签名, 但类型为 t作为 int 的别名而不是抽象的。 with type construct允许使用名称 ORDER构造上面的模块类型表达式。给定 ORDER 的定义, 写作

module Int : ORDER with type t = int = struct … end

相当于写

module Int : sig
type t = int
val leq : t -> t -> bool
val equal : t -> t -> bool
end = struct … end

自类型Int.t透明地等于 int , 它可以与 int 互换使用.

A ORDER signature 主要用于将类型传递给仿函数,如 SetMap构建依赖于其元素的排序关系的数据结构。数据结构只依赖于顺序关系的抽象属性,但是使用数据结构的代码仍然可以知道元素的类型(多亏了另一个with type约束,这个等同于数据结构元素的类型与仿函数参数的类型)。参见 “functors and type abstraction” in the language introduction .

关于ocaml - 模块, "with type"是做什么的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72674925/

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