OCaml:将函数签名设置为另一个函数的签名

OCaml:将函数签名设置为另一个函数的签名,ocaml,Ocaml,假设我有一个on_事件函数,它接受事件发生时调用的处理函数。现在我想写几个不同的事件处理函数,我可以将它们传递到on_事件函数中。是否可以在on_事件文件中指定签名类型,然后将其设置为这些其他函数的签名(在mli文件中)?这样,如果我需要更改签名,我只需要在一个位置进行更改。您可以为类型指定名称: type handler = int -> unit 如果将此定义放入名为event.ml的模块中,则其他模块可以将该类型命名为event.handler 请注意,OCaml将在几乎所有情况下

假设我有一个on_事件函数,它接受事件发生时调用的处理函数。现在我想写几个不同的事件处理函数,我可以将它们传递到on_事件函数中。是否可以在on_事件文件中指定签名类型,然后将其设置为这些其他函数的签名(在mli文件中)?这样,如果我需要更改签名,我只需要在一个位置进行更改。

您可以为类型指定名称:

type handler = int -> unit
如果将此定义放入名为event.ml的模块中,则其他模块可以将该类型命名为
event.handler

请注意,OCaml将在几乎所有情况下推断类型。通常不需要为函数指定类型。但它就像文档一样好

更新

以下是定义函数时指定函数类型的一种方法:

let (f: handler) = fun n -> Printf.printf "%d\n" n

后续问题:我在mli文件中将函数的签名定义为上面定义的类型处理程序。我得到了ml和mli文件之间的签名冲突,因为我的handler函数是int->unit类型,而不是handler类型。如何告诉ocaml ml中的函数是handler类型?根据上述定义,类型
handler
int->unit
是相同的。像上面这样的OCaml
type
定义引入了同义词,而不是新类型。但是,指定函数的类型有点棘手。请参阅更新。