我正在阅读 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时间
答案 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
即便如此,我也不明白它是如何运作的。