Was ich grob will, ist dies:Extensible Aufzeichnungen (glaube ich)
data A = ...
data B = ...
data C = ...
class HasA t where
getA :: t -> A
class HasB t where
getB :: t -> B
class HasC t where
getC :: t -> C
So kann ich etwas tun (Pseudo-Code folgt):
a :: A
b :: B
x = mkRecord { elemA a, elemB b }
y = mkRecord { elemB b, elemA a }
-- type of `x` == type of `y`
natürlich nur die entsprechenden get
Funktionen arbeiten , im obigen Fall getA
und getB
.
Ich möchte auch die folgenden Funktionen
slice :: Subset a b => a -> b
slice x = -- just remove the bits of x that aren't in type b.
add :: e -> a -> a ++ e
add e x = -- add an element to the "record" (compile error if it's already there)
ich so das Gefühl, kein neues Problem ist so vielleicht eine Lösung für diese bereits vorhanden ist. Beachten Sie, dass die Lösung nicht erweiterbar sein muss. Die Anzahl der Typen, mit denen ich umgehen muss, ist endlich und bekannt, aber natürlich und erweiterbar würde man nicht schaden.
Ich habe ein paar Pakete gefunden, die scheinen, in dem Bereich zu sein, was ich suche, nämlich HList und extensible (vielleicht erweiterbar ist besser, weil ich meine Datensätze ungeordnet haben will). Ich bin ein wenig in den Hackage-Dokumenten verloren gegangen, daher möchte ich nur einen Beispielcode (oder einen Link zu einem Beispielcode), der ungefähr das erreicht, wonach ich suche.