2010-02-19 10 views
10

En Haskell es fácil hacer una unión algebraica tipo/discriminada "visualizable" como una cadena simplemente agregando deriving Show a la definición de tipo.Haskell's "deriving Show" en F #?

En F # termino de escribir cosas como:

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

y, obviamente, se pone mucho peor con tipos más complicados.

Cualquier forma de obtener algo como deriving Show en F #?

+0

Err, F # ya hace esto automáticamente, por lo que no tiene que escribir 'deriving Show'. –

Respuesta

20

funciones F # impresión, tales como printf son capaces de dar formato razonablemente cualquier tipo de datos si se utiliza el especificador de formato %A (utilizan ToString si especifica %O). Puede implementar ToString usando sprintf que devuelve la cadena con formato:

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

Esto imprime, por ejemplo, "Pos (1, 2)" y funciona para la mayoría de los tipos F # (listas, sindicatos, registros, tuplas). Es un poco más largo que simplemente agregar deriving Show pero al menos no tiene que implementar la impresión usted mismo.

+2

y ¿cómo se puede lograr 'derivando Read' en F #? –