【发布时间】: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