Jak przekazać funkcję stylu printf innej funkcji w F #

Chciałbym stworzyć funkcję w F #, która akceptuje funkcję stylu printf jako argument i używa tego argumentu do danych wyjściowych. Użycie byłoby następujące:

OutputStuff printfn

Moja pierwsza próba polegała na tym, aby pozwolić kompilatorowi to wszystko dla mnie:

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

To się nie udaje, ponieważ to decydujeoutput to funkcja, która bierzestring i wracającunit, więc drugie połączenie nie powiedzie się.

Następnie próbowałem zadeklarowaćoutput mieć taki sam podpis jakprintfn:

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

To się nie powiedzie, ponieważ kompilator decyduje, że prawdziwy typoutput jestPrintf.TextWriterFormat<string> -> unit, więc znowu drugie połączenie nie powiedzie się. Generuje również ostrzeżenie FS0064 wskazujące, że pierwsze połączenie zostało wysłaneoutput powoduje, że kod jest mniej ogólny niż adnotacje typu, co stanowi sedno problemu.

Wreszcie próbowałem zadeklarować funkcję wyjściową jako oddzielny skrót typu:

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

To się nie udaje z tymi samymi rezultatami co poprzednia próba.

Jak przekonać kompilatora, aby nie specjalizował się w typieoutput i zostaw to jakoPrintf.TextWriterFormat<'a> -> 'a?

questionAnswers(3)

yourAnswerToTheQuestion