In Haskell it is easy to make an algebraic type/discriminated union "displayable" as a string by simply adding deriving Show
to the type definition.
In F# I end up writing things like:
type Pos =
| Pos of int * int
override this.ToString() =
match this with
Pos(startp, endp) -> sprintf "Pos(%d, %d)" startp endp
and obviously it gets much worse with more complicated types.
Any way to get something like deriving Show
in F#?
F# printing functions such as printf
are able to format reasonably any data type if you use the %A
format specifier (they use ToString
if you specify %O
). You can implement ToString
using sprintf
which returns the formatted string:
type Pos =
| Pos of int * int
override x.ToString() = sprintf "%A" x
This prints for example "Pos (1, 2)" and it works for most of the F# types (lists, unions, records, tuples). It's a bit longer than just adding deriving Show
but at least you don't have to implement the printing yourself.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.