Vinyl:Erstellen Sie Aliase für Datensatztypen
-
21-12-2019 - |
Frage
In Vinyl kann ich einen Typalias für einen Datensatz definieren, um den Export in andere Module zu erleichtern:
import Data.Vinyl
name = Field :: "name" ::: String
age = Field :: "age" ::: Int
type Person = ["name" ::: String, "age" ::: Int]
Angenommen, ich füge ein weiteres Feld hinzu, in dem die Höhe gespeichert wird.
height = Field :: "height" ::: Int
Ich möchte einen schönen Typalias für den Datensatz erstellen, der a enthält Person
Und height
.Naiverweise könnte das etwa so aussehen:
type MeasuredPerson = ("height" ::: Int) : Person
Diese Syntax funktioniert offensichtlich nicht!Gibt es eine Möglichkeit, dies zu tun?Gibt es gute Referenzen, die die Array-Syntax auf Typebene erklären, die hier offenbar verwendet wird?
Lösung
Es stellt sich heraus, dass es darauf eine sehr einfache Antwort gibt, die ich übersehen habe:
Data.Vinyl.Rec
definiert sowohl „cons“ als auch „append“ für Listen auf Typebene, sodass Folgendes funktioniert:
type MeasuredPerson = ("height" ::: Int) ': Person
Wenn ich zwei Listen hätte, könnte ich sie wie folgt anhängen:
type Other = Person ++ Address