Nicolas Viennot
Nicolas Viennot

Reputation: 3969

Converting OCaml strings to format6

The following code does not compile:

let x = "hello" in
Printf.printf x

The error is:

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) Can someone give an explanation of the error message?

2) And why would a string cannot be passed to printf ?

Upvotes: 8

Views: 1170

Answers (2)

Jeffrey Scofield
Jeffrey Scofield

Reputation: 66808

As sepp2k points out, in OCaml printf formats have a distinct type, and are not simply strings. String literals are converted automatically to printf formats, but x is not a string literal. If you want to give a name to a format, you can convert it explicitly yourself:

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

You can also cause the implicit conversion by specifying a type for x, but the types of formats are so complicated this is quite painful:

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

(I personally don't understand the format6 type.)

Upvotes: 8

sepp2k
sepp2k

Reputation: 370092

The first argument to printf must be of type ('a, out_channel, unit) format not string. String literals can be automatically converted to an appropriate format type, but strings in general can't.

The reason for that is that the exact type of a format string depends on the contents of the string. For example the type of the expression printf "%d-%d" should be int -> int -> () while the type of printf "%s" should be string -> (). Clearly such type checking is impossible when the format string is not known at compile time.

In your case you can just do printf "%s" x.

Upvotes: 9

Related Questions