2012-04-09 6 views
4

nehme an wir haben ein sehr einfaches Modell:Implementierung einfaches Geschäftsmodell in Haskell

Station mindestens einen Train
Train mindestens zwei

Das Modell, was Stationen jeder zu überprüfen, um zu ermöglichen, hat s Station hat Zugfahrten gegeben und überprüft, welche Züge eine bestimmte Station besuchen.

Wie modelliert man es in Haskell?


Ich bin ein Neuling Haskell, so mir bitte korrigieren: sobald ein Objekt erstellt wird, können Sie es nicht ändern können - Sie nur ein neues Objekt basierend auf, dass man (~ Unveränderlichkeit) machen kann. Habe ich recht? Wenn ja, Ich muss viele temporäre Variablen mit semi-initialisierten Objekten erstellen (während Deserialisierung oder sogar in Komponententests).

Im Grunde brauche ich ein Beispiel für die Modellierung von Domänenklassen in Haskell - nach dem Lesen von "Lerne ein Haskell ..." Ich habe immer noch keine Idee, wie man diese Sprache benutzt.

Antwort

4

Hier ist ein naiver Ansatz:

data Station = Station Train [Train] 
data Train = Train Station Station [Station] 

Sie sollten niemals eine nicht initialisierte Objekt erstellen haben. Zum Beispiel hier ein paar Beispielwerte:

grandCentral = Station regional [national] 
bestWestern = Station regional [national] 
regional = Train grandCentral bestWestern [] 
national = Train grandCentral bestWestern [] 

Allerdings gibt es eine Menge Nachteile bei diesem Ansatz; Das Beobachten der In-Heap-Zyklen ist innerhalb der reinen Teilmenge von Haskell unmöglich, so dass die Aktualisierung oder Verwendung dieser Daten schwierig ist. Die übliche Problemumgehung besteht darin, Ihre Zeiger explizit zu modellieren.

type TrainMap = Map TrainId Train 
type StationMap = Map StationId Station 
type TrainId = Int -- use newtype for more compiler checks at 
type StationId = Int -- the cost of more programmer annoyance 
data Train = Train StationId StationId [StationId] 
data Station = Station TrainId [TrainId] 
+0

Für 'Station' könnte man' Station (NonEmpty TrainId) 'verwenden, aber das hilft leider nicht für Züge. – Landei

+0

@Daniel - danke für deine Antwort. Einige Fragen zu deinem Code: Erstens, kannst du Vorwärts-Deklarationen ** zu Objekten ** in Haskell machen? Zweitens, wenn Sie "regional = Train grandCentral" schreiben - ist "grandCentral" eine ** Referenz **, ** Zeiger ** oder ** Kopie ** des Objekts? Nun, wie ich schon sagte - ich bin ein Haskell-Neuling, aber wenn es keinen richtigen Weg gibt, reale Logik/Relationen zu modellieren, wie sollen wir dann diese Sprache benutzen? Ich mag die Idee mit der Karte. – emesx

+1

@elmes Es gibt keine Vorwärts- oder Rückwärtsdeklarationen. Es gibt nur Erklärungen. Wenn Sie 'regional = Train grandCentral' schreiben, erzeugt die GHC-Implementierung einen Thunk, der, wenn er ausgewertet wird, den' Train'-Tag und einen Zeiger auf den 'grandCentral'-Thunk erzeugt, in welchem ​​Auswertungszustand 'grandCentral' gerade ist . Ich bin mir nicht sicher, ob ich die Hypothese Ihrer letzten Frage verstehe, nämlich dass es keinen richtigen Weg gibt, reale Logik/Relationen zu modellieren; kannst du sagen, was du genauer willst und in welchem ​​Sinne das nicht erreichbar ist? –