F#非文字printf格式字符串 - 如何使它们作为参数传递?

时间:2015-08-28 22:50:15

标签: f# printf

我想使用非文字字符串作为日志记录类型函数的“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

0 个答案:

没有答案