ich wie dieser einen Plattentyp haben:Map Identität Funktors über Rekord
data VehicleState f = VehicleState
{
orientation :: f (Quaternion Double),
orientationRate :: f (Quaternion Double),
acceleration :: f (V3 (Acceleration Double)),
velocity :: f (V3 (Velocity Double)),
location :: f (Coordinate),
elapsedTime :: f (Time Double)
}
deriving (Show)
Das ist cool, weil ich ein VehicleState Signal
haben kann, wo ich alle Arten von Metadaten haben, kann ich eine VehicleState (Wire s e m())
haben, wo ich die netwire
Semantik jedes Signals, oder ich kann eine VehicleState Identity
haben, wo ich tatsächliche Werte zu einer bestimmten Zeit beobachtet habe.
Gibt es eine gute Möglichkeit, zwischen VehicleState Identity
und VehicleState'
, definiert durch Zuordnung runIdentity
über jedes Feld, hin und her zu mappen?
data VehicleState' = VehicleState'
{
orientation :: Quaternion Double,
orientationRate :: Quaternion Double,
acceleration :: V3 (Acceleration Double),
velocity :: V3 (Velocity Double),
location :: Coordinate,
elapsedTime :: Time Double
}
deriving (Show)
Offensichtlich ist es trivial zu schreiben, aber ich habe tatsächlich einige Arten wie dies in meiner realen Anwendung und ich halte das Hinzufügen oder Entfernen von Feldern, so ist es langweilig.
Ich schreibe etwas Vorlage Haskell, die es tut, frage mich nur, ob ich das Rad neu erfinde.
Sie könnten dies mit GHC Generics machen, aber ich weiß nicht, ob es einfacher wäre als TH. Da ich Erfahrung mit TH habe, wäre das auch meine Wahl. – bheklilr
Was ich in Betracht ziehen würde: benutze 'VehicleState' überhaupt nicht und mache einen kurzen Alias für' Identity' und 'runIdentity'. Ich weiß, nicht großartig. – luqui
Oder verwenden Sie [newtype] (http://hackage.haskell.org/package/newtype) und seine Helfer. – luqui