正如托马斯指出,在F#功能可以” t需要多态参数。在这种情况下,我认为Tomas的方法非常好,因为您可能只需要能够传递用于记录的string -> unit
函数。
但是,如果你真的想绕过一个多态函数相当于,一个解决办法是建立一个简单的类型有一个通用的方法,并通过该类型的实例:
type ILogger = abstract Log : Printf.StringFormat<'a,unit> -> 'a
let testLogger (source:seq<'a>) (logger:ILogger) =
logger.Log "Testing..."
let length = source |> Seq.length
logger.Log "Got a length of %d" length
let logger = {
new ILogger with member __.Log format =
Printf.kprintf (printfn "%A: %s" System.DateTime.Now) format }
为了使这项工作更加精美,类型推断,你可以定义一个模块,一个简单的辅助功能:
module Log =
let logWith (logger : ILogger) = logger.Log
let testLogger2 (source:seq<'a>) logger =
Log.logWith logger "Testing..."
let length = source |> Seq.length
Log.logWith logger "Got a length of %d" length
这最后的结果看起来很像托马斯的解决方案,但给你的,你如何定义更多的灵活性,你记录器,可能实际上也可能不实际在这种情况下对你有用。
来源
2011-04-06 20:54:39
kvb
您可能感兴趣的:http://stackoverflow.com/questions/5277902/printf-style-logging-for-f – Daniel 2011-04-06 16:41:57
我见过那个,但它不能帮助我,因为我不' t要框架知道log4net – 2011-04-06 16:44:53
检查出第一个答案,它与log4net无关。 – Daniel 2011-04-06 16:46:25