Ich versuche zu simulieren version numbering in more generic terms in Haskell. Ich suche nach einer Haskell-Datenstruktur, die die Struktur darstellen würde, die ich selbst definiert habe (VersionNumberWithMaybe
).Haskell Datenstruktur zu simulieren Alternative Version Nummerierung Ansatz
data VersionCompoundWithMaybe = Maybe Int -- Just n: 0, 1, 2, 3 ...
-- Nothing: x
maybeToString :: Maybe Int -> String
maybeToString (Just n) = (show n)
maybeToString Nothing = "x"
data VersionNumberWithMaybe = VC (Maybe Int) -- VersionCompound: x, 0, 1, 2, 3 ...
| VNL (Maybe Int) VersionNumberWithMaybe -- VersionNumberLeft: x.x, x.0, x.1, x.2, ... , 1.0, 1.1, 1.2, ... 1.x.x, 2.x.x, 3.x.x, ...
| VNR VersionNumberWithMaybe (Maybe Int) -- VersionNumberRight: the same as above, only underlying structure is different for simple parsing pursposes: x.x, x.0, x.1, x.2, ... , 1.0, 1.1, 1.2, ... 1.x.x, 2.x.x, 3.x.x, ...
deriving (Show)
versionNumberWithMaybeToString :: VersionNumberWithMaybe -> String
versionNumberWithMaybeToString (VNL vc vn) = (maybeToString vc) ++ "." ++ (versionNumberWithMaybeToString vn)
versionNumberWithMaybeToString (VNR vn vc) = (versionNumberWithMaybeToString vn) ++ "." ++ (maybeToString vc)
versionNumberWithMaybeToString (VC vc) = (maybeToString vc)
Gibt es eine ähnliche Standard-Bibliothek-Implementierung, die für das Parsen von Strings in dieser Datenstruktur und Umwandlung zwischen rechten und linken Darstellungen ermöglichen würde? Ich würde mich über Kommentare/Ideen zu diesem Thema freuen. Danke im Voraus!
PS. Ich brauche die Optionen VNL
und VNR
, damit ich die Versionsnummern folgendermaßen vergleichen kann: x.x.3
== x.3
== 3
. Ich gehe davon aus nur VNR
Version zu diesem Zweck arbeiten:
instance Eq VersionNumberWithMaybe where
(VC vc1) == (VC vc2) = (vc1 == vc2)
(VNL vc1 vn1) == (VNL vc2 vn2) = (vc1 == vc2 && vn1 == vn2)
(VNR vn1 vc1) == (VNR vn2 vc2) = (vc1 == vc2 && vn1 == vn2)
(VNL _ (VC vc1)) == (VC vc2) = vc1 == vc2
(VC vc1) == (VNL _ (VC vc2)) = vc1 == vc2
(VNR _ vc1) == (VC vc2) = vc1 == vc2
(VC vc1) == (VNR _ vc2) = vc1 == vc2
diese Definition von Eq
Angesichts Vergleiche folgenden funktioniert wie beabsichtigt fein:
VNR (VNR (VC Nothing) Nothing) (Just 3) == VNR (VC Nothing) (Just 3) -- x.x.3 == x.3 -> True
VNR (VC Nothing) (Just 3) == VC (Just 3) -- x.3 == 3 -> True
Während mit VNL
es wird nicht wie vorgesehen als es wird erlauben, dass solche Vergleiche wie 3.x.x == 3.x -> True
stattfinden
PS2. Vielen Dank für Ihre Kommentare. Ich fange an zu überdenken, ob ich wirklich beide und VNL
(und nicht nur, zum Beispiel VNL
) brauche, um zu erreichen, was ich will. Ich evaluiere, welcher Ansatz besser ist, nur einen zu lassen und dieses ganze conversion_between_representations Kopfweh zu vermeiden.
Sie haben das rekursiv ausgeführt, was bedeutet, dass Sie möglicherweise Versionsnummern wie 1.0.0.0.0.0.0.0.0.0.0 haben können – Emil
Ist es nicht seltsam, dass Sie Versionsnummern wie 'x.2' haben können? –
@WillemVanOnsem Es ist ein bisschen komisch, aber auf der anderen Seite gibt es Projekte, wo das eine Bedeutung hat. Zum Beispiel gibt es vielleicht eine Richtlinie, dass ungerade nummerierte Nebenversionen Bugfix-Releases sind und sogar Inhalts-Patches sind. – amalloy