module - 模块 <name> = struct .. end 和模块类型 <name> = struct.. end 之间的区别?

标签 module ocaml

module <name> =
   struct 
     .. 
   end;;


module type <name> =
    struct (* should have been sig *)
      .. 
end;;

最佳答案

第一个声明一个模块,第二个声明一个模块类型(又名签名)。一个模块类型包含 typeval声明,而模块可以包含定义(例如,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/

相关文章:

typescript - 当 --module 为 'none' 时,如何使用 @types npm 存储库中的 TypeScript 定义文件

python - 从 Python 快速导入自定义 SPSS 命令

ocaml - opa 扩展可以用 Ocaml 编写吗?

list - ocaml超大数据结构建议

haskell - Haskell 或 OCAML 能否在不通过垃圾收集泄漏的情况下处理敏感数据?

c - 错误: initializer element is not constant - linux driver

python - 有没有办法遍历模块的所有功能?

java - Metro jar 的非法反射访问

performance - F# 处理复杂键(如数据结构中的 int*int*int)比 Ocaml 慢得多

ocaml - 在 Queue 数据结构中使用惰性求值有什么好处?