この現象はなぜ発生しますか?OCaml Printf.sprintf
# Printf.sprintf ("Foo %d %s") 2 "bar";;
- : string = "Foo 2 bar"
# Printf.sprintf ("Foo %d"^" %s") 2 "bar";;
Printf.sprintf ("Foo %d"^" %s") 2 "bar";;
Error: This expression has type string but an expression was expected of type
('a -> 'b -> 'c, unit, string) format =
('a -> 'b -> 'c, unit, string, string, string, string) format6
文字列連結が最初に評価されるので、すべて正常に処理されると思います。これはPrintfが採用している型システムのトリッキーと関係がありますか?
詳細な説明は、ありがとうございます。副次的な点として、私はあなたの定式化を見つける "(^^)演算子は、入力コンテキストを作成する.."不明;この演算子は内部に魔法を持たず、 '... format - > ... format - > ... format'とタイプされ、型推論はそのパラメータがこの型の定数文字列であることをチェックする作業を行います。 – gasche
ガスチェが正しいです。理解しなければならないことは、 'Print。* printf'に文字列を渡すときに、' Pervasives.string'型の値を与えていないと、 'Pervasives.format6'の値を与えていることです。 'Pervasives.string'に等しい)。 –
さて、私はちょうど(^^)にはガスチが与えるタイプがあると言わなければならない。確かにその部分に魔法はない。私が理解している唯一の魔法は、適切な 'format'型の文字列定数の宣伝です。 –