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
?