下面的代码无法编译:
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?
第一个参数给printf的类型必须是('a, out_channel, unit) format
不串。 字符串文本可以被自动转换为适当的格式的类型,但一般字符串不能。
其原因是,格式字符串的确切类型依赖于字符串的内容。 例如,表达式的类型printf "%d-%d"
应为int -> int -> ()
而的类型printf "%s"
应该是string -> ()
显然,这种类型检查是不可能的,当格式字符串不是在编译时已知的。
你的情况,你可以做printf "%s" x
。
作为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
类型。)