2010-02-19 7 views
10

In Haskell ist es einfach, einen algebraischen Typ/diskriminierte Vereinigung als String "anzeigbar" zu machen, indem einfach deriving Show zur Typdefinition hinzugefügt wird.Haskells "abgeleitete Show" in F #?

In F # beende ich oben Dinge wie das Schreiben:

type Pos = 
    | Pos of int * int 
    override this.ToString() = 
     match this with 
     Pos(startp, endp) -> sprintf "Pos(%d, %d)" startp endp 

und natürlich wird es viel schlimmer mit komplizierteren Typen.

Irgendein Weg, um etwas wie deriving Show in F # zu bekommen?

+0

Err, F # macht das schon automatisch für Sie, so dass Sie nicht 'Ableitung Show 'schreiben müssen. –

Antwort

20

F # Druckfunktionen wie printf können vernünftigerweise jeden Datentyp formatiert werden, wenn Sie die %A Formatbezeichner verwenden (sie verwenden ToString wenn Sie %O angeben). Sie können implementieren ToStringsprintf verwendet, die den formatierten String zurückgibt:

type Pos = 
    | Pos of int * int 
    override x.ToString() = sprintf "%A" x 

Dies druckt zum Beispiel "Pos (1, 2)" und es funktioniert für die meisten der F # -Typen (Listen, Gewerkschaften, Aufzeichnungen, Tupel). Es ist ein bisschen länger als nur deriving Show hinzufügen, aber zumindest müssen Sie den Druck nicht selbst implementieren.

+2

und wie könnte man in F # das 'Ableiten von Lesen' erreichen? –