Ich habe zwei DSLs - EmployeeAction
und ContactAction
. Hier sind meine Züge (Aktionen)Mit Free Monad mit entweder
komplette Gist: link
sealed trait EmployeeAction[R]
case class GetEmployee(id: Long) extends EmployeeAction[Either[Error, Employee]]
sealed trait ContactAction[R]
case class GetAddress(empId: Long) extends ContactAction[Either[Error, Address]]
ich verwendet habe, cats
'Coproduct
und Inject
hier ist mein Programm-Manager Adresse zu erhalten:
type Program = Coproduct[EmployeeAction, ContactAction, A]
def findManagerAddress(employeeId: Long)
(implicit EA: EmployeeActions[Program],
CA: ContactActions[Program]): Free[Program, Address] = {
import EA._, CA._
for {
employee <- getEmployee(employeeId)
managerAddress <- getAddress(employee.managerId)
} yield managerAddress
}
Die oben doesn Kompilieren Sie nicht, weil getEmployee
einen Either[Error, Employee]
zurückgibt. Wie gehe ich damit in Free
für Verständnis um?
Ich habe versucht, mit EitherT
Monade Transformator wie folgt, es zeigt keine Fehler in IntelliJ, aber es schlägt fehl beim Aufbau.
for {
employee <- EitherT(getEmployee(employeeId))
managerAddress <- EitherT(getAddress(employee.managerId))
} yield managerAddress
Unten ist der Fehler:
[scalac-2.11] /local/home/arjun/code/Free/src/FreeScalaScripts/src/free/program/Program.scala:71: error: no type parameters for method apply: (value: F[Either[A,B]])cats.data.EitherT[F,A,B] in object EitherT exist so that it can be applied to arguments (cats.free.Free[free.Program,Either[free.Error,free.Employee]])
[scalac-2.11] --- because ---
[scalac-2.11] argument expression's type is not compatible with formal parameter type;
[scalac-2.11] found : cats.free.Free[free.Program,Either[free.Error,free.Employee]]
[scalac-2.11] required: ?F[Either[?A,?B]]
[scalac-2.11] employee <- EitherT(getEmployee(employeeId))
[scalac-2.11] ^
Wie gehe ich mit entweder in für das Verständnis und wie die Fehler an den Aufrufer zu propagieren? Ich möchte wissen, für welche alle Mitarbeiter IDs der Anruf fehlgeschlagen ist.
Was ist der Kompilierfehler für "EntwederT"? –
@ZiyangLiu Ich habe den Fehler in der Frage aktualisiert – arjunswaj