Как использовать переменную как строку форматирования с помощью Sprintf?

Я чувствую себя полным noob за то, что мне пришлось спросить об этом, но это меня озадачило.

Я установил строку формата следующим образом:

let fs = "This is my format test %s"

Затем я пытаюсь использовать его так:

let s = sprintf fs "testing"

Когда я это сделаю, я получаю эту ошибку:

//stdin(26,17): error FS0001: The type 'string' is not compatible with the type 'Printf.StringFormat<('a -> 'b)>'

Итак, я тогда попробовал это:

let s = sprintf (Printf.StringFormat fs) "test"

на который ответил REPL:

//stdin(28,18): error FS1124: Multiple types exist called 'StringFormat', taking different numbers of generic parameters. Provide a type instantiation to disambiguate the type resolution, e.g. 'StringFormat<_>'.

Итак, я тогда попробовал это:

let s = sprintf (Printf.StringFormat<string> fs) "test" 

И я получаю это:

//stdin(29,18): error FS0001: The type ''a -> 'b' does not match the type 'string'

Я пропустил что-то больно очевидное? Это использует F # 3.0 на Mac из интерактивного окна Xamarin Studio F #.

Ответ 1

Итак, вам действительно нужно создать StringFormat, который имеет тип функции следующим образом

> sprintf (Printf.StringFormat<string->string>("Hello %s")) "World";;
  val it : string = "Hello World"

В разделе 6.3.16 спецификации показан пример этого.