2017-12-24 17 views
2

私はPrintf.sprintfの結果を別の関数(例えば、f)に差し込んでいます。関数 `Printf.sprintf`を別のものと合成する

let printf : 'a 'b. ('a,unit,string) format -> 'b = 
    (fun fmt -> Printf.sprintf fmt) |> f 

しかし、これはです。TypeCheck、ともObj.magicのいくつかのアプリケーションとそのバージョンを実行していない:私はこのように、これら二つの成分printfを定義しようとしています。そのような「カスタムプリント」を得る正しい方法は何ですか?

+0

前に ''a 'b.'を付けずに試してみてください。 –

答えて

8

Obj.magicを使用しないでください。フォーマット文字列の特殊なタイピングが可変引数printfを達成するために、あなたは簡単な関数合成使用してこのようなものを書くことができない原因

:この困難を克服するために

let sprintf_then_f fmt args ... = f (Printf.sprintf fmt args ...) 

を、Printfk(kontinuation)中で継続スタイルの機能を提供しますPrintf.ksprintfのような名前。それらを使用してください:

val ksprintf : (string -> 'd) -> ('a, unit, string, 'd) format4 -> 'a 
(** Same as [sprintf] above, but instead of returning the string, 
    passes it to the first argument. 
    @since 3.09.0 
*) 
+1

4.02以降、フォーマット文字列は内部的にGADTで実装されており、 "%s"は "CamlinternalFormatBasics(Format(String(No_padding、End_of_format)" "%s")の構文上の砂糖です)形式文字列の入力においては、形式文字列と文字列リテラルの型指向の明確化があります。 – octachron

関連する問題