Бих искал да използвам нелитерални низове за параметъра "формат" на функция тип регистриране, както е показано тук:
// You need to make c:\testDir or something similar to run this.....
//
let csvFile = @"c:\testDir\foo.csv"
open System.IO
let writer file (s:string) =
use streamWriter = new StreamWriter(file, true)
streamWriter.WriteLine(s)
// s
let log format = Printf.ksprintf (writer csvFile) format
let oneString format = (Printf.StringFormat<string->string> format)
let format = oneString "(this does not %s)"
//log format "important string"
log "this works %s" "important string"
Първият ми опит използва буквален низ и горният фрагмент трябва да работи добре за вас, ако създадете директорията, от която се нуждае, или подобна.
След като открих, че не можете просто да „оставите да обвържете“ форматиращ низ, след това научих за Printf.StringFormat
и повече подробности за Printf.ksprintf
, но очевидно пропускам нещо, защото не мога да ги накарам да работят заедно с моя малък пример.
Ако коментирате последния ред и възстановите неговия предшественик, ще видите грешка на компилатора.
Правенето на функцията writer
да връща низ почти помогна (разкоментирайте последния й ред), но след това кара log
да връща низ (което означава, че всяко повикване сега се нуждае от ignore
).
Бих искал да знам как моите форматиращи низове да могат да се задават динамично в рамките на F# printf свят с проверен тип!
Актуализиране Добавих параметъра format
към log
, за да избегна грешка при ограничаване на стойността, която се случва, ако log
не бъде извикан по-късно, както е в моя пример. Също така променям fmt
на format
в oneString
.
Актуализация
Това е различен въпрос от този. Този въпрос не показва, че аргумент на функция се предава на Printf.StringFormat
(незначителна разлика) и няма частта за това, че Printf.ksprintf
не приема функция за продължение, която връща единица.
Мислех, че съм намерил решение с:
let oneString format = (Printf.StringFormat<string->string,unit> format)
това се компилира, но има грешка по време на изпълнение. (Промяната е ,unit
)
Printf.StringFormat
, но не обяснява защо трябва да разкоментирам//s
вwriter
, за да заработят нещата (искамwriter
да върнеunit
). Подозирам, че има някаква тънкост на проверката на типа, която пропускам. - person GMc   schedule 29.08.2015