Как передать функцию в стиле printf другой функции в F #
Я хотел бы сделать функцию в F #, которая принимает функцию в стиле printf в качестве аргумента и использует этот аргумент для вывода данных. Использование будет примерно таким:
OutputStuff printfn
Моя первая попытка состояла в том, чтобы позволить компилятору понять все это для меня:
let OutputStuff output =
output "Header"
output "Data: %d" 42
Это терпит неудачу, потому что это решает, чтоoutput
это функция, принимающаяstring
и возвращаясьunit
, поэтому второй вызов не проходит.
Затем я попытался объявитьoutput
иметь ту же подпись, что иprintfn
:
let OutputStuff (output : Printf.TextWriterFormat<'a> -> 'a) =
output "Header"
output "Data: %d" 42
Это терпит неудачу, потому что компилятор решает, что реальный типoutput
являетсяPrintf.TextWriterFormat<string> -> unit
, так что снова второй вызов не удается. Он также генерирует предупреждение FS0064, указывающее, что первый вызовoutput
делает код менее универсальным, чем аннотации типов, что является основной проблемой.
Наконец, я попытался объявить функцию вывода как отдельное сокращение типа:
type OutputMe<'a> = Printf.TextWriterFormat<'a> -> 'a
let OutputStuff (output : OutputMe<'a>) =
output "Header"
output "Data: %d" 42
Это терпит неудачу с теми же результатами, что и предыдущая попытка.
Как мне убедить компилятор не специализировать типoutput
и оставить какPrintf.TextWriterFormat<'a> -> 'a
?