Я хочу продемонстрировать это, переместив показания времени из функции по двум причинам. Прежде всего, чтобы продемонстрировать, как добавить один или несколько аргументов, которые не используются ksprintf, но также потому, что у нас должна быть функция, которая не имеет побочных эффектов. Если вы хотите, чтобы время считывалось внутри функции, вместо этого создайте функцию-оболочку, которая считывает время, а затем вызывает следующую функцию.
Сначала есть два явных аргумента, которые не передаются в ksprintf. Затем следует неявно строка формата и любые неявные аргументы, требуемые для строки формата.
let tsprintf (dateTime: DateTime) (tag: string) =
let dateTimeString =
dateTime.ToString (@"yyyy/MM/dd HH:mm:ss",
System.Globalization.CultureInfo.InvariantCulture)
Printf.ksprintf (fun formatString ->
"[" + dateTimeString + " <" + tag + ">] " + formatString)
let testTime = DateTime(1987, 12, 31, 11, 59, 58)
let message = tsprintf testTime "007" "Hello %s!" "James Bond"
message.Dump() // LINQPad output : [1987/12/31 11:59:58 <007>] Hello James Bond!
InvariantCulture в сочетании с выбранной строкой формата времени гарантирует, что результат, который вы видите, точно соответствует тому, что содержится в комментарии в конце, независимо от того, где и что.
Причина, по которой я использую DateTime.ToString, заключается в том, что он форматирует DateTime любым удобным для вас способом. Форматирование в ksprintf не кажется хорошей идеей.
Аргументы, не используемые ksprintf, явно объявлены в tsprintf. Строка формата и следующие аргументы для ksprintf не объявляются явно, но они следуют всем явно объявленным аргументам.