Wie man mit `Reader` Monade und` Try` umgeht?
Ich lese diesen großartigen Artikel über Abhängigkeit Injektion in Scala mit Reader Monad.
Das ursprüngliche Beispiel funktioniert gut, aber ich habe die Rückgabetypen des @ ein wenig geänderUserRepository.get/find
. Es warUser
, aber ich habe es in @ geändeTry[User]
.
Dann wird der Code nicht kompiliert, ich hatte viele Male versucht, aber immer noch ohne Glück.
import scala.util.Try
import scalaz.Reader
case class User(email: String, supervisorId: Int, firstName: String, lastName: String)
trait UserRepository {
def get(id: Int): Try[User]
def find(username: String): Try[Use,r]
}
trait Users {
def getUser(id: Int) = Reader((userRepository: UserRepository) =>
userRepository.get(id)
)
def findUser(username: String) = Reader((userRepository: UserRepository) =>
userRepository.find(username)
)
}
object UserInfo extends Users {
def userEmail(id: Int) = {
getUser(id) map (ut => ut.map(_.email))
}
def userInfo(username: String) =
for {
userTry <- findUser(username)
user <- userTry // !!!!!!!! compilation error
bossTry <- getUser(user.supervisorId)
boss <- bossTry // !!!!!!!! compilation error
} yield Map(
"fullName" -> s"${user.firstName} ${user.lastName}",
"email" -> s"${user.email}",
"boss" -> s"${boss.firstName} ${boss.lastName}"
)
}
Der Kompilierungsfehler ist:
Error:(34, 12) type mismatch;
found : scala.util.Try[Nothing]
required: scalaz.Kleisli[scalaz.Id.Id,?,?]
user <- userTry
^
un
Error:(36, 12) type mismatch;
found : scala.util.Try[scala.collection.immutable.Map[String,String]]
required: scalaz.Kleisli[scalaz.Id.Id,?,?]
boss <- bossTry
^
Ich habe das Dokument von @ gelesKleisli.flatMap
(Der Rückgabetyp vonfindUser
undgetUser
istKleisli
) erfordert der Parametertyp:
B => Kleisli[M, A, C]
Seit einemTry
wird kein @ seKleisli
, es gibt solche Fehler.
Ich bin mir nicht sicher, wie ich damit umgehen soll. Kann ich benutzenscala.util.Try
Hier? Wie kann ich es in ein @ verwandeKLeisli
Art? Wie kann ich dieses Beispiel zum Laufen bringen?