【发布时间】:2014-08-22 13:57:29
【问题描述】:
我在将 Printf 类型的函数作为参数传递时遇到问题。 最终目标是创建一个自定义日志记录功能,然后将其注入其他假设日志记录的方法中。所以,我学会了如何使用kprintf。但是如何将其结果传递到调用堆栈。 任何人都可以帮助我使以下代码正常工作吗?
open System
type logging () =
let logWarning =
let logToConsole msg = Console.WriteLine("WARN: {0} {1}", DateTime.Now, msg)
fun fmt -> Printf.kprintf logToConsole fmt
let doThingsWithLogging warningLogger =
warningLogger "%s %d %f" "DoThingsWithLogger" 3 3.29
warningLogger "%d %A" 3 "DoThingsAgain"
member __.RunTest() =
logWarning "%s %d %f" "String, int, float" 12 38.8
logWarning "%d %f %s" 83 128.9 "int, float, string"
doThingsWithLogging logWarning
let test = logging()
test.RunTest ()
如果您尝试在 FSI 中运行它,您会立即看到问题所在 - warningLogger 参数的类型推断不允许编译对该函数的第二次调用。 我怎样才能使它工作,以便我可以使用 warningLogger,作为正常的 printf 类型的函数? 非常感谢您。
【问题讨论】:
标签: generics f# functional-programming printf