Ich arbeite an einer API-Integration, die die Existenz von XML oder JSON zugunsten des Anhängens von Zeichendaten ignoriert. (Das Metro2 Format, wenn Interesse besteht)Modellieren Sie ein serielles Format im Typsystem, wie zB Servant
Ich vereinfacht, aber vorstellen, dass eine Person wie diese serialisiert werden muss:
- Bei pos 0, 4 Zeichen: Anzahl der Bytes in der Nachricht
- an Pos 5: 6 Zeichen:
"PERSON"
Fest - an Pos codiert 11: 20 Zeichen: Name, linksbündig und platz gepolsterte
- an Pos 21: 8 Zeichen: Geburtstag,
YYYYMMDD
- Bei Position 29: 3 Zeichen: Alter, rechtsbündig und null-gepolstert
Numerische Felder sind immer rechtsbündig ausgerichtet und nullgefüllt. Textfelder sind immer linksbündig und Leerzeichen aufgefüllt.
Zum Beispiel:
"0032PERSONDAVID WILCOX 19820711035"
Kann ich drücke dies in der Art System? Wie funktioniert das? servant? Etwas wie das?
newtype ByteLength = ByteLength Int
newtype Age = Age Int
-- etc
type PersonMessage
= Field ByteLength '0
:| Field "PERSON" '5
:| Field Name '11
:| Field Date '21
:| Field Age '29
-- :| is a theoretical type operator, like :> in servant
-- the number is the expected offset
-- the length of the field is implicit in the type
Kann ich statisch überprüfen, ob meine Implementierung der Serialisierung mit dem Typ übereinstimmt?
Kann ich statisch prüfen, ob der Offset des 3. Feldes (Name
) 11
ist? Dass sich die Längen der vorhergehenden Felder zu 11 addieren? Ich nehme an, nein, da es scheint, dass es vollständige abhängige Artunterstützung benötigen würde.
Ist das auf dem richtigen Weg?
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
Update: Beispiel einer Funktion würde ich statisch gerne bestätigen:
personToMetro :: Person -> PersonMessage
personToMetro p = error "Make sure that what I return is a PersonMessage"
Können Sie geben Sie ein Beispiel für eine Funktion, von der Sie mehr statische Garantien erhalten möchten? Wie die linke Seite und Typ Unterschrift mindestens – jberryman
Nur ein Beispiel hinzugefügt. Hilft das? –