2017-12-24 16 views
2

Ich habe viele Vorkommen des Einstecken des Ergebnisses Printf.sprintf in eine andere Funktion (sagen wir) f. Ich habe versucht, die Zusammensetzung printf dieser beiden zu definieren, wie folgt aus:Komponiert die Funktion `Printf.sprintf` mit einem anderen

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

Doch diese typecheck nicht, und auch nicht die Version davon mit mehreren Anwendungen von Obj.magic. Was ist der richtige Weg, um einen solchen "Custom Printf" zu bekommen?

+0

Versuchen Sie es ohne die "a" b. vor. –

Antwort

8

Verwenden Sie nicht Obj.magic.

Aufgrund der spezielle Typisierung von Formatstrings variadische printf zu erreichen, kann man nicht solche Dinge schreibt Zusammensetzung mit einfacher Funktion:

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

diese Schwierigkeit zu überwinden, bietet Printf Fortsetzung Stil Funktionen mit k (kontinuation) in die Namen wie Printf.ksprintf. Bitte verwenden Sie sie:

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

Beachten Sie, dass Formatzeichenfolge seit 4.02 intern mit GADTs implementiert ist, und "% s" ist nur syntaktischer Zucker für "CamlinternalFormatBasics. (Format (String (No_padding, End_of_format),"% s ")), also die einzige Magie übrig Bei der Eingabe von Formatzeichenfolgen handelt es sich um die typengesteuerte Disambiguierung von Formatzeichenfolgen und Stringliteralen. – octachron

Verwandte Themen