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 #?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top