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