Как указывает Томас, функции в F # не могут требовать полиморфных аргументов.В этом случае, я думаю, что подход Томаса довольно хорош, так как вам, вероятно, нужно только иметь возможность передать функцию 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
Этот конечный результат во многом похож на решение Томаса, но дает вам немного больше гибкости в том, как вы определяете свой регистратор, который на самом деле может или не может бытьполезно в этом случае.