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
?