【问题标题】:syntax issue around kprintf in F#F# 中关于 kprintf 的语法问题
【发布时间】:2021-05-09 21:22:52
【问题描述】:

我有一个使用 NLog 的项目,并且记录器周围有一个包装器,以便在某些区域关闭日志记录:

member this.SetQuiet q = quiet <- q

member this.Trace format = Printf.kprintf (fun s -> if not quiet then logger.Trace(s)) format
member this.Debug format = Printf.kprintf (fun s -> if not quiet then logger.Debug(s)) format
member this.Info  format = Printf.kprintf (fun s -> if not quiet then logger.Info(s))  format
member this.Warn  format = Printf.kprintf (fun s -> if not quiet then logger.Warn(s))  format
member this.Error format = Printf.kprintf (fun s -> if not quiet then logger.Error(s)) format
member this.Fatal format = Printf.kprintf (fun s -> if not quiet then logger.Fatal(s)) format

这很好用,但我有一个问题:

logger.Info "hello"
logger.Info <| "hello"

会正常工作,而:

"hello" |> logger.Info

不会编译并出现此错误:

typecheck error The type 'string' is not compatible with the type 'Printf.StringFormat'

有人能解释一下为什么会失败吗? kprintf-continuation-format 的顺序在这里仍然应该得到尊重,不是吗?

有解决办法吗?原因是我正在尝试做一个 'tee' 以非详细方式记录消息(tee 只是应用一个函数,然后返回原始参数):

"my messsage"
|> tee logger.Info
|> Result.Ok

【问题讨论】:

    标签: f# continuations


    【解决方案1】:

    这是因为printf 和类似的方法使用了格式化。它允许类型安全地使用这些方法。例如printfn "%d" 强制整数作为参数

    printfn "%d" 3
    printfn "%d" 3.14 // error
    

    printfn "%s %f" 强制执行字符串和浮点数。

    printfn "%s %f" "Hello" 3.14
    printfn "%s %f" '3' 14 // error
    

    这意味着您应该以这种方式更改方法(添加"%s"

    member this.Trace format = Printf.kprintf (fun s -> if not quiet then logger.Trace(s)) "%s" format
    

    【讨论】:

      猜你喜欢
      • 2011-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-15
      • 2012-08-11
      • 2023-03-11
      • 1970-01-01
      相关资源
      最近更新 更多