module <name> =
struct
..
end;;
module type <name> =
struct (* should have been sig *)
..
end;;
最佳答案
第一个声明一个模块,第二个声明一个模块类型(又名签名)。一个模块类型包含 type
和 val
声明,而模块可以包含定义(例如,let
绑定(bind))。您可以使用签名来限制模块的类型,就像对函数一样。例如,
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.f 0 ;;
- : int = 1
# M.g 0 ;;
Error: Unbound value M.g
M.g
未绑定(bind),因为它被签名 T
隐藏.使用模块类型的另一种常见方法是作为仿函数的参数和返回值。例如,
Map.Make
the standard library 中的仿函数接受一个带有签名的模块 Map.OrderedType
并创建一个带有签名 Map.S
的模块附言请注意,问题中有一个错误。使用声明模块类型
module type <name> = sig
...
end
关于module - 模块 <name> = struct .. end 和模块类型 <name> = struct.. end 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4042465/