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#?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top