Wie Übergeben einer Printf-style-Funktion an eine andere Funktion in F #

Ich möchte eine Funktion in F # erstellen, die eine printf-artige Funktion als Argument akzeptiert und dieses Argument zur Ausgabe von Daten verwendet. Die Verwendung würde ungefähr so ​​aussehen:

OutputStuff printfn

Mein erster Versuch war, den Compiler alles für mich herausfinden zu lassen:

let OutputStuff output =
    output "Header"
    output "Data: %d" 42

Das scheitert daran, dass es das entscheidetoutput ist eine Funktion, die nimmtstring und zurückkehrenunit, so dass der zweite Anruf fehlschlägt.

Als nächstes habe ich versucht zu deklarierenoutput die gleiche Unterschrift haben wieprintfn:

let OutputStuff (output : Printf.TextWriterFormat<'a> -> 'a) =
    output "Header"
    output "Data: %d" 42

Dies schlägt fehl, weil der Compiler entscheidet, dass der tatsächliche Typ vonoutput istPrintf.TextWriterFormat<string> -> unit, so scheitert wieder der zweite Anruf. Es wird auch die Warnung FS0064 generiert, die angibt, dass der erste Anruf an erfolgtoutput bewirkt, dass der Code weniger generisch ist als die Typanmerkungen. Dies ist der Kern des Problems.

Zuletzt habe ich versucht, die Ausgabefunktion als separate Typabkürzung zu deklarieren:

type OutputMe<'a> = Printf.TextWriterFormat<'a> -> 'a
let OutputStuff (output : OutputMe<'a>) =
    output "Header"
    output "Data: %d" 42

Dies schlägt mit den gleichen Ergebnissen wie beim vorherigen Versuch fehl.

Wie kann ich den Compiler davon überzeugen, den Typ nicht zu spezialisieren?output und lass es wiePrintf.TextWriterFormat<'a> -> 'a?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage