O "Show Deriving" de Haskell em F#?
-
21-09-2019 - |
Pergunta
Em Haskell, é fácil fazer um tipo de união algébrica/discriminação "exibida" como uma string, simplesmente adicionando deriving Show
para a definição de tipo.
Em F# eu acabo escrevendo coisas como:
type Pos =
| Pos of int * int
override this.ToString() =
match this with
Pos(startp, endp) -> sprintf "Pos(%d, %d)" startp endp
E, obviamente, fica muito pior com tipos mais complicados.
Qualquer maneira de conseguir algo como deriving Show
em f#?
Solução
F# Funções de impressão, como printf
são capazes de formatar razoavelmente qualquer tipo de dados se você usar o %A
especificador de formato (eles usam ToString
Se você especificar %O
). Você pode implementar ToString
usando sprintf
que retorna a sequência formatada:
type Pos =
| Pos of int * int
override x.ToString() = sprintf "%A" x
Isso imprime, por exemplo, "POS (1, 2)" e funciona para a maioria dos tipos F# (listas, sindicatos, registros, tuplas). É um pouco mais longo do que apenas adicionar deriving Show
Mas pelo menos você não precisa implementar a impressão.