Como passar uma função de estilo printf para outra função em F #

Eu gostaria de fazer uma função em F # que aceita uma função de estilo printf como um argumento e usa esse argumento para dados de saída. O uso seria algo como o seguinte:

OutputStuff printfn

Minha primeira tentativa foi deixar o compilador descobrir tudo para mim:

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

Isso falha porque decide queoutput é uma funçãostring e retornandounit, então a segunda chamada falha.

Em seguida eu tentei declararoutput ter a mesma assinatura queprintfn:

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

Isso falha porque o compilador decide que o tipo real deoutput éPrintf.TextWriterFormat<string> -> unit, então novamente a segunda chamada falha. Também gera aviso FS0064 indicando que a primeira chamada paraoutput faz com que o código seja menos genérico do que as anotações de tipo, que é o cerne da questão aqui.

Por fim, tentei declarar a função de saída como uma abreviação de tipo separada:

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

Isso falha com os mesmos resultados da tentativa anterior.

Como faço para convencer o compilador a não especializar o tipo deoutput e deixe comoPrintf.TextWriterFormat<'a> -> 'a?

questionAnswers(3)

yourAnswerToTheQuestion