F# нелитерални низове във формат printf - как да ги направя пропускливи като параметри?

Бих искал да използвам нелитерални низове за параметъра "формат" на функция тип регистриране, както е показано тук:

// 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)


person GMc    schedule 28.08.2015    source източник
comment
Това ли търсите: stackoverflow.com/questions/19202773/   -  person John Palmer    schedule 29.08.2015
comment
вашият отговор на този въпрос ми помогна да намеря Printf.StringFormat, но не обяснява защо трябва да разкоментирам //s в writer, за да заработят нещата (искам writer да върне unit). Подозирам, че има някаква тънкост на проверката на типа, която пропускам.   -  person GMc    schedule 29.08.2015
comment
Вчера се забърках малко с това. Мисля, че ще намерите за полезно да добавите изрични анотации към всичко. В някакъв момент успях да накарам кода да се компилира и да направя това, което поискахте, но при второто изпълнение попаднах в състояние, което извежда грешка по време на изпълнение.   -  person Robert Sim    schedule 31.08.2015