मैं इस महान लेख को dependency injection in scala with Reader monad के बारे में पढ़ रहा हूं।'रीडर' मोनैड और 'कोशिश करें' को कैसे संभालें?
मूल उदाहरण अच्छी तरह से काम कर रहा है, लेकिन मैंने UserRepository.get/find
के रिटर्न प्रकारों पर थोड़ा बदलाव किया। यह User
था, लेकिन मैंने इसे Try[User]
में बदल दिया।
फिर कोड संकलित नहीं किया जाएगा, मैंने कई बार कोशिश की थी, लेकिन अभी भी भाग्यशाली नहीं है।
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[User]
}
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}"
)
}
संकलन त्रुटि है:
Error:(34, 12) type mismatch;
found : scala.util.Try[Nothing]
required: scalaz.Kleisli[scalaz.Id.Id,?,?]
user <- userTry
^
और
Error:(36, 12) type mismatch;
found : scala.util.Try[scala.collection.immutable.Map[String,String]]
required: scalaz.Kleisli[scalaz.Id.Id,?,?]
boss <- bossTry
^
मैं Kleisli.flatMap
के दस्तावेज़ (findUser
की वापसी प्रकार और getUser
Kleisli
है) पढ़ें, यह पैरामीटर प्रकार की आवश्यकता है है:
B => Kleisli[M, A, C]
चूंकि Try
Kleisli
नहीं होगा, ऐसी त्रुटियां हैं।
मुझे यकीन नहीं है कि इसे कैसे संभालें। क्या मैं यहां scala.util.Try
का उपयोग कर सकता हूं? मैं इसे KLeisli
प्रकार में कैसे बदल सकता हूं? मैं इस उदाहरण को कैसे काम कर सकता हूं?