F # -Datentypen für inklusive Optionen
Ich bin ein C # -Programmierer, der gerade die Schönheit der F # -Programmierung herausgefunden hat (dank des Buches Domain Modeling Made Functional ). Ich war jedoch überrascht, dass ich keine Beispiele für ein häufiges Szenario gefunden habe: Der Benutzer hat mehrere Optionen, die er ankreuzen kann. Wenn Sie beispielsweise ein Hotelzimmer buchen, möchten Sie möglicherweise mehrere zusätzliche Optionen haben, z. B. kostenloses WLAN, Allergikerzimmer, Haustiere erlaubt, kostenloses Frühstück, kostenlose Parkplätze usw. Wie modellieren Sie dies? Alle Beispiele, die ich gefunden habe, haben nur zwei Optionen zur Auswahl: entweder opt1 oder opt2 oder beides. Diese Lösung lässt sich jedoch nicht skalieren.
Ich habe eine Lösung gefunden , aber ich brauche auch eine Lösung für einen schwierigeren Fall, bei dem Optionen Parameter haben können, wie im Beispiel für die Hotelzimmerreservierung: Entfernung vom Stadtzentrum (Benutzer kann einen Wert angeben), Maximaler Preis pro Nacht usw. Dies sind Suchoptionen, die der Benutzer ankreuzen kann, wenn er möchte, aber wenn er ankreuzt, muss er für jede angekreuzte Option einen erforderlichen Parameter angeben.
Antworten
Da Sie möchten, dass den verschiedenen Optionen Werte zugeordnet werden, würde ich in Ihrem Fall nur einen Datensatz mit mehreren optionalen Feldern verwenden.
type Booking =
{
freeWifi: unit option
maxPricePerNight: decimal option
}
static member Empty =
{
freeWifi = None
maxPricePerNight = None
}
Es mag so aussehen, als wäre die Erweiterung dieses Datensatzes ein Schmerz, aber ich denke nicht, dass dies in einem realen System wirklich der Fall wäre. Mit Dingen wie dem bereitgestellten leeren Element und dem Mustervergleich für einzelne Datensatzfelder müssten Sie nie wirklich alle Felder außerhalb der Typdefinition auflisten.
Eine robustere Lösung für dieses Problem finden Sie im CLI-Optionsparser Argu (mithilfe von DUs und Anführungszeichen, um Optionswerte nach Fallnamen zu suchen). Dies ist jedoch ein Overkill für das von Ihnen behandelte Szenario.