”Higher Kinded Type”? • Ein Typ, der einen anderen enthalten kann. • A[ ] → A[B] • oder leichter verst¨ andlich List[ ] → List[Int] Aber um diese geht es hier nicht direkt.
Registrierungsmodell (wie gehabt) . Registrierungsmodell (Formularendpunkt) final case class RegistrationFormSubmitted(email: Option[EMail], pass: Option[UserPassword], name: Option[CustomerName], ...) . Registrierungsmodell (Parser) final case class RegistrationFormParsed( email: Either[String, EMail], pass: Either[String, UserPassword], name: Either[String, CustomerName], ...) Ihr versteht, was ich meine...
manche Funktionen gesetzt sein m¨ ussen. • Parameterklasse final case class MyArgs(id: ProgramID, filters: List[Filter], startDate: Option[OffsetDateTime], endDate: Option[OffsetDateTime]) • Funktion A def doSomething(args: MyArgs): ??? = ??? • Funktion B def doSomethingWithDates(args: MyArgs): ??? = { val s = args.startDate.get // crash val e = args.endDate.get // and burn ... }
die logisch, aber nicht f¨ ur den Compiler ersichtlich zusammenh¨ angen • ein Modell, das Strukturen der Felder abstrahiert • weniger Boilerplate • De-Duplizierung • strukturierte Beziehungen (f¨ ur Compiler verst¨ andlich)
g¨ ultig sein. final case class RegistrationForm[T[_]](email: T[EMail], pass: T[UserPassword], name: T[CustomerName], address: T[PostalAddress], phone: T[PhoneNumber], contact: T[ContactName], vat: T[VATNumber]) in der Anwendung: RegistrationForm[Either[String, _]](...) RegistrationForm[Option](...)
= A • soll heißen RegistrationForm[Id](...) MyArgs[Id](...) • f¨ ur Funktionen def doSomethingWithDates(args: MyArgs[Id]): ??? = { val s = args.startDate // safe val e = args.endDate // safe ... }