Cómo pasar una función de estilo printf a otra función en F #
Me gustaría hacer una función en F # que acepte una función de estilo printf como un argumento, y use ese argumento para generar datos. El uso sería algo como lo siguiente:
OutputStuff printfn
Mi primer intento fue dejar que el compilador lo resolviera todo por mí:
let OutputStuff output =
output "Header"
output "Data: %d" 42
Eso falla porque decide queoutput
es una función que tomastring
y regresandounit
, entonces la segunda llamada falla.
A continuación intenté declararoutput
tener la misma firma queprintfn
:
let OutputStuff (output : Printf.TextWriterFormat<'a> -> 'a) =
output "Header"
output "Data: %d" 42
Esto falla porque el compilador decide que el tipo real deoutput
esPrintf.TextWriterFormat<string> -> unit
, así que de nuevo falla la segunda llamada. También genera un aviso FS0064 que indica que la primera llamada aoutput
hace que el código sea menos genérico que las anotaciones de tipo, que es el punto crucial del problema aquí.
Por último, intenté declarar la función de salida como una abreviatura de tipo separada:
type OutputMe<'a> = Printf.TextWriterFormat<'a> -> 'a
let OutputStuff (output : OutputMe<'a>) =
output "Header"
output "Data: %d" 42
Esto falla con los mismos resultados que el intento anterior.
¿Cómo convenzo al compilador para que no se especialice en el tipo deoutput
y dejarlo comoPrintf.TextWriterFormat<'a> -> 'a
?