转换OCaml的字符串format6(Converting OCaml strings to for

2019-07-29 07:08发布

下面的代码无法编译:

let x = "hello" in
Printf.printf x

错误是:

Error: This expression has type string but an expression was expected of type
     ('a, out_channel, unit) format =
       ('a, out_channel, unit, unit, unit, unit) format6

1)有人可以给错误消息的解释?

2)为什么会串不能被传递给printf?

Answer 1:

第一个参数给printf的类型必须是('a, out_channel, unit) format不串。 字符串文本可以被自动转换为适当的格式的类型,但一般字符串不能。

其原因是,格式字符串的确切类型依赖于字符串的内容。 例如,表达式的类型printf "%d-%d"应为int -> int -> ()而的类型printf "%s"应该是string -> () 显然,这种类型检查是不可能的,当格式字符串不是在编译时已知的。

你的情况,你可以做printf "%s" x



Answer 2:

作为sepp2k指出,OCaml中printf格式有一个独特的类型,而不是简单的字符串。 字符串文本自动转换为printf格式,但x是不是字面的字符串。 如果你想给一个名称的格式,你可以明确自己进行转换:

> let x = format_of_string "hello" in Printf.printf x
hello- : unit = ()

您也可以通过指定X型引起的隐式转换,但类型的格式非常复杂,这是很痛苦:

# let (x: ('a,'b,'c,'d,'d,'a) format6) = "hello" in Printf.printf x;;
hello- : unit = ()

(我个人不明白format6类型。)



文章来源: Converting OCaml strings to format6
标签: ocaml