将OCaml字符串转换为format6

时间:2012-05-05 03:47:33

标签: ocaml

以下代码无法编译:

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?

2 个答案:

答案 0 :(得分:8)

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

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

在您的情况下,您可以printf "%s" x

答案 1 :(得分:7)

正如sepp2k所指出的那样,在OCaml中,printf格式具有不同的类型,而不仅仅是字符串。 String literals 会自动转换为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类型。)