2010-02-19 6 views
10

In Haskell è facile creare un tipo algebrico/unione discriminata "visualizzabile" come stringa aggiungendo semplicemente deriving Show alla definizione del tipo."Show derivante" di Haskell in F #?

In F # io alla fine a 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ù complicati.

Un modo per ottenere qualcosa come deriving Show in F #?

+0

Err, F # lo fa già automaticamente per voi in modo da non dover scrivere 'derivando Show'. –

risposta

20

funzioni 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). È un po 'più lungo che aggiungere deriving Show ma almeno non devi implementare la stampa da solo.

+2

e come si può ottenere 'derivando Read' in F #? –