Haskell di “derivante Show” in F #?
-
21-09-2019 - |
Domanda
In Haskell è facile fare un tipo algebrico / unione discriminati "visualizzabile" come una stringa semplicemente aggiungendo deriving Show
alla definizione del tipo.
In F # finisco per scrivere cose come:
type Pos =
| Pos of int * int
override this.ToString() =
match this with
Pos(startp, endp) -> sprintf "Pos(%d, %d)" startp endp
e, ovviamente, diventa molto peggio con i tipi più complessi.
Un modo per ottenere qualcosa di simile deriving Show
in F #?
Soluzione
funzioni di F # di stampa come printf
sono in grado di formattare ragionevolmente qualsiasi tipo di dati se si utilizza l'identificatore di formato %A
(usano ToString
se si specifica %O
). È possibile implementare ToString
usando sprintf
che restituisce la stringa formattata:
type Pos =
| Pos of int * int
override x.ToString() = sprintf "%A" x
Questo stampa, ad esempio "Pos (1, 2)" e funziona per la maggior parte dei tipi F # (liste, sindacati, dischi, tuple). E 'un po' di più di una semplice aggiunta di deriving Show
ma almeno non si deve attuare la stampa da soli.