2

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.

+0

Was ist der Kompilierfehler für "EntwederT"? –

+0

@ZiyangLiu Ich habe den Fehler in der Frage aktualisiert – arjunswaj

Antwort

0

EitherT dauert eine F[Either[A, B]], aber Sie haben eine Free[Program, Either[Error, Employee]], die nicht kompatibel ist.

type MyAlias[A] = Free[Program, A] 

Dann getEmployee Rückkehr für getAddressMyAlias[Either[Error, Employee]] und gleiche machen:

Die Lösung eine Art Alias ​​für Free[Program, A] zu erstellen.

+0

Eigentlich [hier ist der Kern] (https://gist.github.com/arjunswaj/4c3c7789ccdd9f832f2cf16690b57cbf) von dem, was ich habe. Selbst mit Type Alias ​​funktioniert das für das Verständnis nicht, da EatleT und Free nicht kombiniert werden können. Ich möchte wissen, wie ich damit umgehen soll. – arjunswaj