Haskell de “derivar Show” en F #?
-
21-09-2019 - |
Pregunta
En Haskell es fácil hacer un / unión discriminada tipo algebraica "visualizable" como una cadena, simplemente añadiendo deriving Show
a la definición de tipo.
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 así como deriving Show
en F #?
Solución
F # impresión de funciones 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
). Se puede implementar usando ToString
sprintf
que devuelve la cadena con formato:
type Pos =
| Pos of int * int
override x.ToString() = sprintf "%A" x
Esta impresora, 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 acaba de añadir deriving Show
pero al menos no tiene que poner en práctica la impresión de sí mismo.