Je travaille sur une intégration API qui ignore l'existence de XML ou JSON en faveur de l'ajout de données de caractères. (Le format Metro2, si vous êtes intéressé)Modéliser un format série dans le système de type, comme Serviteur
Je simplifie, mais imaginez qu'une personne doit être sérialisé comme ceci:
- pos 0, 4 caractères: Nombre d'octets dans le message A
- pos 5: 6:
"PERSON"
caractères codés dur - A pos 11: 20 caractères: Nom, aligné à gauche et rembourré espace
- A pos 21: 8 caractères: Anniversaire,
YYYYMMDD
- A la position 29: 3 caractères: âge, aligné à droite et à zéros
Les champs numériques sont toujours alignés à droite et à zéros. Les champs de texte sont toujours alignés à gauche et remplis d'espace.
Par exemple:
"0032PERSONDAVID WILCOX 19820711035"
Puis-je exprimer dans le système de type? Aime ce que fait servant? Quelque chose comme ça? Puis-je vérifier de façon statique que mon implémentation de la sérialisation correspond au type? Puis-je vérifier de manière statique que le décalage du troisième champ (Name
) est 11
? Que les longueurs des champs précédents totalisent 11? Je suppose que non, car cela semble nécessiter un support de type dépendant complet.
Est-ce sur la bonne voie?
instance ToMetro Age where
-- get the length into the type system using a type family?
field = Numeric '3
-- express how this is encoded. Would need to use the length from the type family. Or if that doesn't work, put it in the constructor.
toMetro age = Numeric age
Mise à jour: Exemple d'une fonction que je voudrais valider statiquement:
personToMetro :: Person -> PersonMessage
personToMetro p = error "Make sure that what I return is a PersonMessage"
Pouvez-vous donner un exemple d'une fonction dont vous voulez obtenir plus de garanties statiques? Comme le côté gauche et la signature de type au moins – jberryman
Juste ajouté un exemple. Est ce que ça aide? –