Ocaml 将时间转换为秒字符串问题

Ocaml 将时间转换为秒字符串问题,ocaml,Ocaml,我正在阅读《真实世界OCaml》一书,该书中的代码出现了错误。因为,我在GitHub中没有看到任何关于图书问题的活动,所以我想在这里问你。以下是问题cobe: let log_entry maybe_time message = let time = match maybe_time with | Some x -> x | None -> Time.now () in Time.to_sec_string time ^ " -

我正在阅读《真实世界OCaml》一书,该书中的代码出现了错误。因为,我在GitHub中没有看到任何关于图书问题的活动,所以我想在这里问你。以下是问题cobe:

let log_entry maybe_time message =
    let time = match maybe_time with
        | Some x -> x
        | None -> Time.now ()
    in
    Time.to_sec_string time ^ " -- " ^ message
;;
下一个错误是:

Error: This expression has type zone:Core.Zone.t -> string but an expression was expected of type string
据我所知,这是关于打电话的

Time.to_secu_字符串时间


我在网上找到了关于那个问题的讨论

解决方案是添加:

Time.to_sec_string ~zone:Core.Zone.local (time) ^ " -- " ^ message

尽管如此,我还是不明白它是如何工作的。

在旧版本的Core library中,
to_secu_string
函数具有以下接口:

(** [to_sec_string t] Same as to_string, but without milliseconds *)
val to_sec_string : t -> string
在某个时间点,他们改变了它的接口,现在它是

(** Same as [to_string_abs], but without milliseconds *)
val to_sec_string : t -> zone:Zone.t -> string
这意味着,这是一个有两个参数的函数。第一个仍然是
Time.t
类型的值,但第二个是指定时区的
Zone.t
类型的参数。与常规位置参数不同,带标签的参数可以在任意位置传递给函数,因此不需要记住参数的顺序。通常的调用如下所示:

let s = Time.to_sec_string time ~zone:Time.Zone.local
let s = Time.to_sec_string ~zone:Time.Zone.local time
其中
Time.Zone.local
是一个时区对象,表示您的本地时区。因为它是一个带标签的参数,所以您也可以这样调用函数:

let s = Time.to_sec_string time ~zone:Time.Zone.local
let s = Time.to_sec_string ~zone:Time.Zone.local time
此外,由于此处的两个参数具有不同的类型,OCaml甚至可以在不使用标签的情况下猜测谁是谁,因此您可以回退到位置参数:

let s = Time.to_sec_string time Time.Zone.local
最后,Core中的大多数类型都有接口
to_string
函数。因此,一个更简单的修复方法是使用它,而不是使用
来保存字符串。它的格式稍有不同,但更为详细:

Time.to_string time ^ " -- " ^ message

据我所知,问题在于Tmie.to_sec_string time返回的函数不是字符串。该函数似乎已更新,现在有一个额外的参数
zone:Core.zone.t
。您必须应用一些时区数据
z
,如
time.to_sec_string~ zone:z time
time.to_sec_string~ zone:Core.zone.local(time):返回保存时间的字符串。然后将该字符串与--and message(thx到^”-“^message)连接起来