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
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:
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.
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"
.
If you override ToString method, that should do.
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?