Syntax OCaml函子的语法

Syntax OCaml函子的语法,syntax,ocaml,functor,Syntax,Ocaml,Functor,为什么会这样: module type ENTRY = sig type t end module type LOG = functor (E : ENTRY) -> sig type t end 这是日志的有效实现 module Log :LOG = functor (LogEntry : ENTRY) -> struct type t = LogEntry.t list end 但事实并非如此 module Log (LogEntry: ENTRY)

为什么会这样:

module type ENTRY = sig type t end       
module type LOG = functor (E : ENTRY) -> sig type t end 
这是日志的有效实现

module Log :LOG  = functor (LogEntry : ENTRY) -> 
  struct  type t = LogEntry.t list end
但事实并非如此

module Log (LogEntry: ENTRY) :LOG  = struct
type t = LogEntry.t list end

Error: Signature mismatch:                                                                                                             
Modules do not match: sig type t = LogEntry.t list end is not included in LOG
如果我从LOG的两个定义中删除sig标签(:LOG),那么它们返回的类型与它们只是语法糖[1]的类型相同


[1]

错误消息令人困惑,但第一个示例通过而第二个示例失败的原因其实很简单。比较:

type entry = int
type log = int -> string
let log : log = fun s -> string_of_int s

模块情况下的错误消息指出,由于未应用的函子没有字段,因此函子中不包含模块字段


ETA:从逻辑上讲,函子不能有字段:函数/函子与数据结构/模块是“不同种类的野兽”这使得错误消息令人困惑,听起来好像我们被要求引入一个字段,尽管它已经出现在函子的结果中。

让我澄清一下lukstafi的回答。
LOG
是函子的类型,在第一种情况下,它与
LOG
实现本身匹配(恰好是一个函子),但在第二种情况下,它与函子应用程序的结果匹配(恰好是一个普通模块),因此不匹配


总而言之,这看起来像是语法上的误解。使用OCaml编译器版本4.01.0仔细阅读。

let log (s : entry) : log = string_of_int s