¿Cómo manejar la mónada `Reader` y` Try '?

Estoy leyendo este gran artículo sobreinyección de dependencia en scala con mónada Reader.

El ejemplo original funciona bien, pero hice un pequeño cambio en los tipos de retorno deUserRepository.get/find. EraUser, pero lo cambié aTry[User].

Entonces el código no se compilará, lo intenté muchas veces, pero aún sin suerte.

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}"
    )
}

El error de compilación es:

Error:(34, 12) type mismatch;
 found   : scala.util.Try[Nothing]
 required: scalaz.Kleisli[scalaz.Id.Id,?,?]
      user <- userTry
           ^

y

Error:(36, 12) type mismatch;
 found   : scala.util.Try[scala.collection.immutable.Map[String,String]]
 required: scalaz.Kleisli[scalaz.Id.Id,?,?]
      boss <- bossTry
           ^

Leí el documento deKleisli.flatMap (El tipo de retorno defindUser ygetUser esKleisli), requiere que el tipo de parámetro sea:

B => Kleisli[M, A, C]

Desde unTry no será unKleisli, hay tales errores.

No estoy seguro de cómo manejarlo. Puedo usarscala.util.Try ¿aquí? ¿Cómo puedo convertirlo en unKLeisli ¿tipo? ¿Cómo puedo hacer que este ejemplo funcione?

Respuestas a la pregunta(1)

Su respuesta a la pregunta