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 に答える