How do I customize output of a custom type using printf?

后端 未结 3 493
难免孤独
难免孤独 2020-12-03 10:01

I\'ve read through a good chunk of Expert F# and am working on building an actual application. While debugging, I\'ve grown accustomed to passing fsi commands like

相关标签:
3条回答
  • 2020-12-03 10:19

    It looks like the Right Way to do this in F# 2.0 is by using the StructuredFormatDisplay attribute, for example:

    [<StructuredFormatDisplay("hello {a}")>]
    type myType = {a: int}
    

    In this example, instead of the default {a = 42;}, you would get hello 42.

    This works the same way for object, record, and union types. And although the pattern must be of the format "PreText {PropertyName} PostText" (PreText and PostText being optional), this is actually more powerful than ToString() because:

    1. PropertyName can be a property of any type. If it is not a string, then it will also be subject to structured formatting. Don Syme's blog gives an example of recursively formatting a tree in this way.

    2. It may be a calculated property. So you could actually get ToString() to work for record and union types, though in a rather round-about way:

      [<StructuredFormatDisplay("{AsString}")>]
      type myType = 
          {a: int}
          override m.ToString() = "hello"
          member m.AsString = m.ToString()  // a property that calls a method
      

    By the way, ToString() will always be used (even for record and union types) if you call printfn "%O" instead of printfn "%A".

    0 讨论(0)
  • 2020-12-03 10:23

    If you override ToString method, that should do.

    0 讨论(0)
  • 2020-12-03 10:36

    Hmm... I vaguely recall some changes to this, but I forget if they happened before or after the CTP (1.9.6.2).

    In any case, on the CTP, I see that

    type MyType() =
        override this.ToString() = "hi"
    let x = new MyType()
    let xs = Array.create 25 x
    printfn "%A" x
    printfn "%A" xs
    

    when evaluated in the VFSI window does what I would want, and that

    x;;
    xs;;
    

    also prints nicely. So, I guess I am unclear how this differs from what is desired?

    0 讨论(0)
提交回复
热议问题