Module 模块之间的差异<;名称>;=结构。。端部和模块类型<;名称>;=结构。。结束? 模块= 结构 .. 完;;; 模块类型= 结构(*应为sig*) .. 完;;;

Module 模块之间的差异<;名称>;=结构。。端部和模块类型<;名称>;=结构。。结束? 模块= 结构 .. 完;;; 模块类型= 结构(*应为sig*) .. 完;;;,module,ocaml,Module,Ocaml,模块类型描述模块。它与.ml和.mli之间的区别相同,第一个声明模块,第二个声明模块类型(也称为签名)。模块类型包含type和val声明,而模块可以包含定义(例如let绑定)。您可以使用签名来限制模块的类型,就像对函数一样。比如说, module <name> = struct .. end;; module type <name> = struct (* should have been sig *) .. end;;

模块类型描述模块。它与.ml和.mli之间的区别相同,第一个声明模块,第二个声明模块类型(也称为签名)。模块类型包含
type
val
声明,而模块可以包含定义(例如
let
绑定)。您可以使用签名来限制模块的类型,就像对函数一样。比如说,

module <name> =
   struct 
     .. 
   end;;


module type <name> =
    struct (* should have been sig *)
      .. 
end;;
现在,我们有

module type T = sig
  val f : int -> int
end

module M : T = struct
  let f x = x + 1
  let g x = 2 * x
end
M.g
未绑定,因为它被签名
T
隐藏

使用模块类型的另一种常见方法是将其用作functor的参数和返回值。例如,中的
Map.Make
functor获取带有签名的模块
Map.OrderedType
,并创建带有签名的模块
Map.S

请注意问题中有个错误。使用声明模块类型

# M.f 0 ;;
- : int = 1
# M.g 0 ;;
Error: Unbound value M.g
模块类型=sig
...
结束

A结构(writed
struct…end
)是一组定义。语言中的任何对象都可以在模块中定义:核心值(
let x=2+2
)、类型(
type t=int
)、模块(
module Empty=struct end
)、签名(
module type Empty=sig end
),等等。模块是结构的泛化:结构就是模块,一个函子也是如此(把它想象成一个函数,它接受一个模块作为参数并返回一个新模块)。模块与核心价值观相似,但存在于更高的层次:模块可以包含任何内容,而核心价值观只能包含其他核心价值观

签名是一组规范(有些语言使用术语声明)。可以在模块中指定语言中的任何对象:核心值(
val x:int
)、类型(
type t=int
)、模块(
module Empty:sig end
)、签名(
module type Empty=sig end
),等等。模块类型概括签名:模块类型指定模块,碰巧指定结构的模块类型称为签名。模块类型与模块的关系就像普通类型与核心价值的关系一样

编译单元(
.ml
文件)是结构。接口(
.mli
文件)是签名

所以
module Foo=struct…end
定义了一个名为
Foo
的模块,它恰好是一个结构。这类似于
let foo=(1,“a”)
,它定义了一个名为
foo
的值,该值恰好是一对。而
模块类型FOO=sig…end
(注意:
sig
,而不是
struct
)定义了一个名为
FOO
的模块类型,它恰好是一个签名。这类似于
type foo=int*string
,它定义了一个名为
foo
的类型,该类型恰好是一个产品类型

⑨ 事实上,自从OCAML3.12引入了一流的模块后,这种情况就不再存在了,但它已经足够接近介绍性演示了。

您是否尝试编译您的
模块类型Name=struct。。。在提问之前结束
?我只想举例说明。我当时正在学习一个大模块,意识到我不想让人们从实际问题中分心。
module type <name> = sig
  ...
end