以下代码无法编译:
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?
答案 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
类型。)