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

时间:2015-12-11 08:24:15

标签: ocaml

我正在阅读 Real World 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_sec_string时间

2 个答案:

答案 0 :(得分:10)

在旧版Core库中,to_sec_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的{​​{3}}参数,用于指定时区。与常规位置参数不同,带标签的参数可以传递给任意位置的函数,因此您无需记住参数的顺序。通常的调用将如下所示:

let s = Time.to_sec_string time ~zone:Time.Zone.local

其中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功能。因此,更容易解决的问题是使用它而不是to_sec_string。它有一些不同的,更冗长的格式,但是:

Time.to_string time ^ " -- " ^ message

答案 1 :(得分:5)

我在GitHub

上找到了有关该问题的讨论

解决方案是添加:

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

即便如此,我也不明白它是如何运作的。