是否可以创建自定义Printf.TextWriterFormat?

时间:2017-03-11 15:38:18

标签: f#

我希望通过类比Printf.TextWriterFormat(添加%.参数)在F#中创建自定义类型。 有可能吗?

P.S。我发现只有how to create custom Type provider

修改的: 我想添加具有生成静态类型的新限定符。或者使用生成静态类型创建我的格式字符串。我不想使用标准Printf.TextWriterFormat或与之结合使用。

1 个答案:

答案 0 :(得分:4)

不,您无法创建任意格式文字。您可以获得的最接近的是使用相当模糊的"%a" format specificier,这是类型安全的,可能正是您所要求的:

open System
open System.IO


type MyRecord = {
    Name  : String
    Value : Int32
}


let myRecord = {
    Name  = "Hello World"
    Value = 42
}


let formatAsString () { Name = name; Value = value } =
    sprintf "RECORD NAME \"%s\" AND VALUE \"%d\"!" name value


let formatIntoWriter (writer : TextWriter) =
    formatAsString () >> writer.Write


// Functions from the Core.Printf module that return strings
// require a format function that returns a string.
let formattedAsString = sprintf "%a" formatAsString myRecord

// Functions from the Core.Printf module that return Unit
// require a format function that accepts a TextWriter.
printfn "%a" formatIntoWriter myRecord

丑陋的是,根据您使用的格式功能(在我使用sprintfprintfn的代码中),您必须为自定义类型提供不同的格式化功能。

好消息是:

let printMyRecord = printfn "%a" formatIntoWriter

现在的类型为MyRecord -> Unit,因此您只能将MyRecord的实例传递给它。