我想使用非文字字符串作为日志记录类型函数的“format”参数,如下所示:
// 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
。
更新
这是与this one不同的问题。该问题没有显示传递给Printf.StringFormat
的函数参数(一个小的差异),并且它没有关于Printf.ksprintf
没有采用返回单位的延续函数的部分。
我以为我找到了一个解决方案:
let oneString format = (Printf.StringFormat<string->string,unit> format)
这个编译,但是有一个运行时错误。 (更改为,unit
)