« Dérivant Show » dans F # Haskell?
-
21-09-2019 - |
Question
Dans Haskell, il est facile de faire un type algébrique / union discriminée « affichable » comme une chaîne en ajoutant simplement deriving Show
à la définition de type.
En F # Je finis par écrire des choses comme:
type Pos =
| Pos of int * int
override this.ToString() =
match this with
Pos(startp, endp) -> sprintf "Pos(%d, %d)" startp endp
et, évidemment, il devient bien pire avec des types plus complexes.
Toute façon d'obtenir quelque chose comme deriving Show
en F #?
La solution
F # fonctions d'impression telles que printf
peuvent raisonnablement formater tout type de données si vous utilisez le spécificateur de format %A
(ils utilisent ToString
si vous spécifiez %O
). Vous pouvez mettre en œuvre à l'aide ToString
sprintf
qui retourne la chaîne formatée:
type Pos =
| Pos of int * int
override x.ToString() = sprintf "%A" x
Cette affiche par exemple "Pos (1, 2)" et cela fonctionne pour la plupart des types de # F (listes, syndicats, dossiers, tuples). Il est un peu plus que le simple ajout deriving Show
mais au moins vous ne devez pas mettre en œuvre la même impression.