正如托馬斯指出,在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