将时间转换为秒字符串问题
Convert time into seconds string issue
我正在阅读 Real World OCaml 一书,但该书的代码出现错误。因为,我在 GitHub 中没有看到任何关于书籍问题的 activity,所以我想在这里问你。这是问题科比:
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 time
我在 GitHub
上找到了关于该问题的讨论
解决方法是添加:
Time.to_sec_string ~zone:Core.Zone.local (time) ^ " -- " ^ message
尽管如此,我还是不明白它是如何工作的。
在旧版本的核心库中,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
类型的 labeled 参数。与常规位置参数不同,带标签的参数可以在任意位置传递给函数,因此您无需记住参数的顺序。通常的调用看起来像这样:
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
我正在阅读 Real World OCaml 一书,但该书的代码出现错误。因为,我在 GitHub 中没有看到任何关于书籍问题的 activity,所以我想在这里问你。这是问题科比:
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 time
我在 GitHub
上找到了关于该问题的讨论解决方法是添加:
Time.to_sec_string ~zone:Core.Zone.local (time) ^ " -- " ^ message
尽管如此,我还是不明白它是如何工作的。
在旧版本的核心库中,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
类型的 labeled 参数。与常规位置参数不同,带标签的参数可以在任意位置传递给函数,因此您无需记住参数的顺序。通常的调用看起来像这样:
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