8

以下代码无法编译:

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 ?

4

2 回答 2

9

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

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

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

于 2012-05-05T03:57:52.617 回答
8

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

于 2012-05-05T03:57:11.900 回答