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?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage